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

Rob*_*ert 5 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()
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

还有更多CreateXXXView使用OwnFormMixin..

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

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

sup*_*cuo 2

除非您允许用户修改ForeignKeyField否则没有理由将其包含在 \xe2\x80\x94 形式中,我会采用您的第一个解决方案,将exclude用户字段保留在您的 之外ModelForm,并且设置用户来自request.user. 事实上,Django 文档现在有一个与这些完全相同的示例

\n\n

您的优势在于,不必防止对user_id参数的操纵,不必暴露您的内部用户 ID,也不必担心不同的创建更新情况。一个小小的缺点是,如果您需要更改对象关联的能力,则User需要重新开始。

\n