Django用户HiddenInput与直接在基于类的视图的视图中保存

时间:2012-05-30 17:41:29

标签: django django-class-based-views

请将此作为考虑问题。也许有人会使用其中一个 以下解决方案。

我有几个包含ForeignKey(User)字段的模型。 我基于类的创建视图来自通用CreateView

添加新对象时,有两个选项可以保存关联用户:

  1. 通过覆盖form_valid方法在视图中保存表单; 这不会暴露user_id(此处未提及的其他数据不应公开)

    class CreateOfferView(CreateView):
    
        model = Offer
        form_class = SomeModelFormWithUserFieldExcluded
    
        def form_valid(self, form):
            instance = form.save(commit=False)
            instance.user = self.request.user
            instance.save()
    
  2. 将存储(和公开)用户ID的表单保存在隐藏字段中。 这是棘手的部分。有更多的模型与用户字段...所以 在创建表单时,我需要用初始(当前登录)用户填充用户字段,并且我还需要隐藏该字段。为此,我使用了OwnFormMixin

    class OwnFormMixin(object):
    
        def get_form(self, form_class):
            form = super(OwnFormMixin, self).get_form(form_class)
            form.fields['user'].widget = forms.HiddenInput()
    
        def get_initial(self):
            initial = super(OwnFormMixin, self).get_initial()
            initial['user'] = self.request.user.pk
            #I could also do this in get_form() with form.fields['user'].initial
    
    class CreateOfferView(OwnFormMixin, CreateView):
        model = Offer
        form_class = SomeModelFormWithAllFields
    
  3. 使用CreateXXXView ..

    还有更多OwnFormMixin

    如何在表单中保存用户数据?

    隐藏与直接保存在您的观看中?什么是利弊?

1 个答案:

答案 0 :(得分:2)

除非您允许用户修改 ForeignKeyField,否则没有理由将其包含在表单中 - 我会使用您使用exclude的第一个解决方案保持用户字段不在ModelForm范围内,并将用户设置为request.user。实际上,Django documentation now has an example along these exact lines

您的优势在于无需防止操纵user_id参数,不会暴露您的内部用户ID,也不必担心不同的Create vs。 Update案例。稍微不利的是,如果您需要更改对象User的相关内容,则需要重新开始。