5

Ich habe zwei Anwendungen, family und person. In der Klasse Person möchte ich die verfügbaren Optionen mother und father auf die Objekte beschränken, die bereits aus denselben family erstellt wurden. Wenn ich das family_pk verwenden könnte, setze ich get_initial() in person/views.py:PersonCreateview ein, und benutze das family_pk, um die ForeignKey Wahlen von mother und father einzuschränken, das scheint, könnte es eine große Weise sein, Logik zu gruppieren. Ist das möglich?CBV CreateView Grenze ForeignKey basierend auf 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']]) 

Antwort

10

Dies ist vielleicht ein bisschen alt, aber ich fand über diese Antwort eine Lösung: https://stackoverflow.com/a/291968/1971587

So wie ich es eigentlich mit get_form machen gelandet war(). Also in Ihrem Fall glaube ich, so etwas wie dies funktionieren würde:

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

ich nicht get_initial glauben() würde immer noch notwendig sein, hier, aber es kann in Ihrem Fall für andere Stücke erforderlich sein. –