【问题标题】:CBV CreateView limit ForeignKey based on get_initial()CBV CreateView 限制 ForeignKey 基于 get_initial()
【发布时间】:2013-09-08 16:35:35
【问题描述】:

我有两个应用程序,familyperson。在Person 类中,我想将可用的motherfather 选项限制为已经由相同family 创建的对象。如果我可以使用我在person/views.py:PersonCreateview 中设置的get_initial() 中的family_pk,并使用family_pk 来限制motherfather 的ForeignKey 选择,这似乎是一个很好的方法组逻辑。这可能吗?

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']])

【问题讨论】:

    标签: django foreign-keys django-queryset django-class-based-views


    【解决方案1】:

    这可能有点老了,但我通过这个答案找到了解决方案:https://stackoverflow.com/a/291968/1971587

    我最终使它工作的方式实际上是使用 get_form()。所以在你的情况下,我相信这样的事情会起作用:

    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']])
    

    【讨论】:

    • 我不相信 get_initial() 在这里仍然是必要的,但在您的情况下可能需要其他部分。
    猜你喜欢
    • 2018-11-24
    • 2018-04-21
    • 2018-03-04
    • 2019-03-20
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2023-01-16
    • 2014-01-02
    相关资源
    最近更新 更多