5

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

我有几个模型包含一个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
    

还有更多CreateXXXView使用OwnFormMixin..

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

隐藏与直接保存在您的视图中?什么是优点/缺点?

4

1 回答 1

2

除非您允许用户修改. ForeignKeyField_ 事实上,Django 文档现在有一个符合这些确切思路的示例excludeModelFormrequest.user

您的优势在于不必防止对user_id参数进行操作,不必暴露您的内部用户 ID,也不必担心不同的 CreateUpdate 案例。一个轻微的缺点是,如果您需要更改对象关联的能力,则User需要重新开始。

于 2012-08-05T19:57:26.717 回答