Tôi có hai ứng dụng, family
và person
. Trong lớp Person
, tôi muốn giới hạn các lựa chọn có sẵn mother
và father
đối với các đối tượng đó đã được tạo ra giống nhau family
. Nếu tôi có thể sử dụng số family_pk
tôi đặt trong get_initial()
trong person/views.py:PersonCreateview
và sử dụng family_pk
để hạn chế lựa chọn ForeignKey là mother
và father
có vẻ như đó là cách tuyệt vời để nhóm logic. Điều này có thể không?Giới hạn CreateView của CBV ForeignKey dựa trên get_initial()
family/models.py
class Family(models.Model):
lastname=models.CharField(max_length=100)
def __str__(self):
return self.lastname
family.views.py
from django.views import generic
from django.core.urlresolvers import reverse
from .models import Family
class FamilyListView(generic.ListView):
context_object_name='family_list'
model=Family
class FamilyDetailView(generic.DetailView):
context_object_name='family'
model=Family
pk_url_kwarg='family_pk'
class FamilyCreateView(generic.CreateView):
model=Family
def get_success_url(self,**kwargs):
return reverse('family-detail',kwargs={'family_pk':self.object.pk})
person/models.py
class Person(models.Model):
fields=('family','firstname','mother','father')
family=models.ForeignKey(Family)
firstname=models.CharField(max_length=100)
mother=models.ForeignKey('self',blank=True,null=True)
father=models.ForeignKey('self',blank=True,null=True)
def __str__(self):
return self.firstname
person/views.py
from django.views import generic
from django.core.urlresolvers import reverse
from django.shortcuts import get_object_or_404
from .models import Person
from family.models import Family
class PersonDetailView(generic.DetailView):
model=Person
pk_url_kwarg='person_pk'
class PersonCreateView(generic.CreateView):
model=Person
def get_initial(self):
family=get_object_or_404(Family,pk=self.kwargs.get('family_pk'))
return {'family':family,}
def get_success_url(self,**kwargs):
return reverse('family:family-detail',args=[self.kwargs['family_pk']])
Tôi không tin get_initial() vẫn cần thiết ở đây, nhưng nó có thể cần thiết trong trường hợp của bạn cho các phần khác. –