0

所以,我有一个 Django 通用视图:

class Foobaz(models.Model):
    name = models.CharField(max_length=140)
    organisation = models.ForeignKey(Organisation)


class FoobazForm(forms.ModelForm):
    class Meta:
        model = Foobaz
        fields = ('name')


class FoobazCreate(CreateView):
    form_class = FoobazForm

    @login_required
    def dispatch(self, *args, **kwargs):
        return super(FoobazCreate, self).dispatch(*args, **kwargs)

我要做的是从 URL 中获取组织 ID:

/organisation/1/foobaz/create/

并将其添加回创建的对象。我意识到我可以在 中做到这一点CreateView.form_valid(),但据我所知,这是完全未经验证的。

我已经尝试将它添加到,get_form_kwargs()但这并不期望组织 kwarg,因为它不在包含的字段中。

理想情况下,我想做的是将它添加到表单的实例中以与其余部分一起验证它 - 确保它是一个有效的组织,并且有问题的用户具有正确的权限来添加一个新的 foobaz 到它。

如果这是最好的方法,我很乐意发表自己的观点,但我可能只是错过了一个技巧。

谢谢!

4

2 回答 2

0

我认为最好包含该organisation字段并将其定义为隐藏和只读,这样 django 将为您验证它。

然后,您可以get_queryset像这样覆盖方法:

def get_queryset(self):
    return Foobaz.objects.filter(
        organisation__id=self.kwargs['organisation_id'])

whereorganisation_id是 url 模式中的关键字。

于 2013-10-13T11:14:32.610 回答
0

您可以覆盖 View 的get_kwargs()方法和 Form 的save()方法。在get_kwargs()我“注入”organization_id到表单的初始数据中,并在save()我使用提供的初始数据检索丢失的信息时:

在 urls.py 中:

urlpatterns('',
    #... Capture the organization_id
    url(r'^/organisation/(?P<organization_id>\d+)/foobaz/create/',
        FoobazCreate.as_view()),
    #...
)

在views.py中:

class FoobazCreate(CreateView):
    # Override get_kwargs() so you can pass
    # extra info to the form (via 'initial')
    # ...(all your other code remains the same)
    def get_form_kwargs(self):
        # get CreateView kwargs
        kw = super(CreateComment, self).get_form_kwargs()
        # Add any kwargs you need:
        kw['initial']['organiztion_id'] = self.kwargs['organization_id']
        # Or, altenatively, pass any View kwarg to the Form:
        # kw['initial'].update(self.kwargs)
        return kw

在 forms.py 中:

class FoobazForm(forms.ModelForm):
    # Override save() so that you can add any
    # missing field in the form to the model
    # ...(Idem)
    def save(self, commit=True):
        org_id = self.initial['organization_id']
        self.instance.organization = Organization.objects.get(pk=org_id)
        return super(FoobazForm, self).save(commit=commit)
于 2014-05-13T07:21:22.893 回答