【问题标题】:Django: How to set a hidden field on a generic create view?Django:如何在通用创建视图上设置隐藏字段?
【发布时间】:2014-03-06 07:13:00
【问题描述】:

我正在运行 Django 1.6.x

为了扩展我的用户,我添加了另一个存储数据的模型:

class UserProfile (models.Model):
    user = models.ForeignKey(User)
    height = models.IntegerField(blank=True, null=True)

现在我想添加一个视图,它允许用户在那里添加自己的信息。从django.views.generic.edit.CreateView 开始,但还希望至少提供一个编辑/更新。

所以我添加了导入并创建了一个视图:

from django.views.generic.edit import CreateView, UpdateView
# .... 
class UserProfileCreateView(CreateView):
    model = UserProfile
    fields = ['height']

我还在 urls.py 中添加了条目:

    url(r'^userprofile/new/$', login_required(UserProfileCreateView.as_view()), name="add_userprofile")

但现在我被困在如何以正确的方式分配用户 ID 的问题上。我想在后台设置这个字段。有什么提示吗?

【问题讨论】:

    标签: django django-generic-views


    【解决方案1】:

    为避免出现类似 must be a “User” instance 错误,您可以试试这个。

     def form_valid(self, form):
            owner = self.request.user
            print("Bot owner1", owner)
            tenant = get_object_or_404(Tenant, user=owner)
            print("Bot owner2 ", tenant)
            form.instance.tenant = tenant
    
        return super().form_valid(form)
    

    原来是这样的

    print("Bot owner1", owner)
    

    print("Bot owner2 ", tenant)
    

    有不同的结果。

    除了form_valid 方法之外的任何其他方法都可能带来安全风险。 即我可以通过检查浏览器上的元素来编辑初始值并输入我的新值。如果您的代码不能验证我的输入 Bang!!!Bang!!你被黑了。

    【讨论】:

      【解决方案2】:
      class UserProfileCreateView(CreateView):
          def form_valid(self, form):
               self.object = form.save(commit=False)
               self.object.user = self.request.user
               self.object.save()
               return super(ModelFormMixin, self).form_valid(form)
      

      【讨论】:

      • 即使对象无效,这不会保存对象吗?
      • 这个方法在ProcessFormView中验证后调用,
      • 对了。我不太习惯基于类的视图。感谢您的澄清。
      【解决方案3】:

      你可以这样做:

      • 从请求对象中获取用户。
      • 覆盖 UserProfileCreateView 类的 form_valid 方法,
      • 将用户附加到表单实例并保存。
      class UserProfileCreateView(CreateView):
          model = UserProfile
          fields = ['height']
      
           def form_valid(self, form):
               user = self.request.user
               form.instance.user = user
               return super(UserProfileCreateView, self).form_valid(form)
      

      此代码适用于 Python 2.7.x

      【讨论】:

      • 2 年后,仍然是一个很好的答案!
      • 对我不起作用。因为这些字段没有填写,所以它永远不会验证为真,所以代码永远不会运行:(
      • 4 年后,仍然有用
      • 5 年后,仍然有用
      猜你喜欢
      • 2022-11-14
      • 1970-01-01
      • 2011-08-09
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 2017-11-13
      相关资源
      最近更新 更多