관리자 패널에서 모델의 개체 수를 제한하는 것이 가능하다는 것을 알고 싶습니다.관리자 패널에서 모델의 개체 생성을 제한 할 수 있습니까?
예를 들어, 'Homepage'라는 모델이 있고 관리 패널에 사용자가 Homepage의 인스턴스를 두 개 이상 만들 수 없도록하려는 경우입니다.
내가 할 수있는 방법이 있습니까?
관리자 패널에서 모델의 개체 수를 제한하는 것이 가능하다는 것을 알고 싶습니다.관리자 패널에서 모델의 개체 생성을 제한 할 수 있습니까?
예를 들어, 'Homepage'라는 모델이 있고 관리 패널에 사용자가 Homepage의 인스턴스를 두 개 이상 만들 수 없도록하려는 경우입니다.
내가 할 수있는 방법이 있습니까?
을 시도해보십시오
class HomePageAdmin(admin.ModelAdmin):
def add_view(self, request):
if request.method == "POST":
# Assuming you want a single, global HomePage object
if HomePage.objects.count() > 1:
# redirect to a page saying
# you can't create more than one
return HttpResponseRedirect("foo")
return super(HomePageAdmin, self).add_view(request)
# ...
admin.site.register(HomePage, HomePageAdmin)
을 동일한 작업을 수행하는 또 다른 전략은 메서드를 사용하여 단일 HomePage 요구 사항을 적용하는 HomePage 용 사용자 지정 ModelForm을 만드는 것입니다. 이 귀하의 요구 사항이 아닌 리디렉션으로, 유효성 검사 오류로 표시 할 (또는 데이터베이스 오류 등)됩니다
from django import forms
from django.forms.util import ErrorList
class HomePageModelForm(forms.ModelForm):
def clean(self):
if HomePage.objects.count() > 1:
self._errors.setdefault('__all__', ErrorList()).append("You can only create one HomePage object.")
return self.cleaned_data
# ...
class HomePageAdmin(admin.ModelAdmin):
form = HomePageModelForm
# ...
admin.site.register(HomePage, HomePageAdmin)
을은 "사용자 당 하나 개의 홈페이지가"의 경우, 사용자에 대한 외래 키를 가지고 홈페이지가 필요합니다 위의 것을 적용하십시오. 현재 사용자 객체를 threadlocals에 저장하여 HomePageModelForm.clean
모든 사용자에 대해 Homepage
을 1로 제한하려면 일대일 관계를 사용하고 OneToOneField
을 사용할 수 있습니다. N으로 제한하는 경우에는 pre_save
signal이 유용 할 수 있습니다.
당신이 영향을 원하는 (데이터베이스 모델에 영향을하고 싶지 않아) 단지 관리자의 경우, 사용자 정의 ModelAdmin 서브 클래스 만들 수 있습니다
class HomePage(models.Model):
user = models.ForeignKey(User, unique=True)
homepage = models.CharField(max_length=100, unique=True)
class Meta:
unique_together = (("user", "homepage"),)
에서 감사해야합니다. 이것은 매우 명확한 설명입니다.) – israkir