5

Tôi có hai ứng dụng, familyperson. Trong lớp Person, tôi muốn giới hạn các lựa chọn có sẵn motherfather đố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à motherfather 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']]) 

Trả lời

10

Đây có lẽ là một chút cũ, nhưng tôi tìm thấy một giải pháp thông qua câu trả lời này: https://stackoverflow.com/a/291968/1971587

Con đường tôi đã kết thúc làm cho nó làm việc đã thực sự với get_form(). Vì vậy, trong trường hợp của bạn tôi tin rằng một cái gì đó như thế này sẽ làm việc:

class PersonCreateView(generic.CreateView): 
    model = Person 

    def get_family(self): 
     return get_object_or_404(Family, pk=self.kwargs.get('family_pk')) 

    def get_form(self, form_class): 
     form = super(generic.CreateView, self).get_form(form_class) 
     family = self.get_family() 
     form.fields['mother'].queryset = Person.objects.filter(family) 
     form.fields['father'].queryset = Person.objects.filter(family) 
     return form 

    def get_initial(self): 
     initial = super(generic.CreateView, self).get_initial() 
     initial['family'] = self.get_family() 
     return initial 

    def get_success_url(self, **kwargs): 
     return reverse('family:family-detail', args=[self.kwargs['family_pk']]) 
+1

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. –