Django:如何在通用创建视图上设置隐藏字段?

时间:2014-02-08 21:33:22

标签: django django-generic-views

我正在运行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。我希望在后台设置此字段。任何提示?

3 个答案:

答案 0 :(得分:15)

你可以这样做:

  • 从请求对象中获取用户。
  • 覆盖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

答案 1 :(得分: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)

答案 2 :(得分:0)

为避免出现诸如必须是“用户”实例这样的错误,您想尝试一下。

 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方法之外的任何其他方法都可能带来安全风险。 即我可以通过检查浏览器上的元素来编辑初始值,然后输入新值。如果您的代码无法验证我的输入,请!!!!你被黑了。