python - 将 request.user 与 Django ModelForm 一起使用

标签 python django django-forms django-views

我遇到了登录用户和 Django ModelForm 的问题。我有一个名为 _Animal_ 的类,它有一个 ForeignKeyUser 以及一些与动物相关的数据,例如年龄、种族等。

用户可以将动物添加到数据库中,我必须跟踪每个动物的作者,因此我需要添加用户创建动物实例时记录的 request.user

models.py

class Animal(models.Model):
    name = models.CharField(max_length=300)
    age = models.PositiveSmallIntegerField()
    race = models.ForeignKey(Race)
    ...
    publisher = models.ForeignKey(User)
    def __unicode__(self):
        return self.name

class AnimalForm(ModelForm):
    class Meta:
        model = Animal

主要目标是隐藏表单中的发布者字段,并在点击保存按钮时提交登录用户。

我可以使用 initial 在 View 中捕获当前用户,但我也想要不显示该字段。

views.py

@login_required
def new_animal(request):
    if request.method == "POST":
        form = AnimalForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('/')
        else:
            variables = RequestContext(request, {'form': form})
            return render_to_response('web/animal_form.html', variables)
    else:
        form = AnimalForm(initial={'publisher': request.user})
    variables = RequestContext(request, {'form': form})
    return render_to_response('web/animal_form.html', variables)

最佳答案

你只需要将它从表单中排除,然后在 View 中设置。

class AnimalForm(ModelForm):
    class Meta:
        model = Animal
        exclude = ('publisher',)

...在 View 中:

    form = AnimalForm(request.POST)
    if form.is_valid():
        animal = form.save(commit=False)
        animal.publisher = request.user
        animal.save()

(还请注意,第一个 else 子句 - 紧跟在重定向之后的行 - 是不必要的。如果您将其省略,执行将落到 View 末尾的两行,它们是相同的。)

关于python - 将 request.user 与 Django ModelForm 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8466768/

相关文章:

mysql - Django 查询自然排序

python - Django 抛出 ValueError : too many values to unpack (expected 2) with no change to the code

django - 手动渲染 MultiValueField 的子字段

python - Django - 表单值错误[简单?]

python - 调试Python代码

django - 通过模板标签将变量添加到当前上下文

python - 设置 EB CLI - 错误 nonetype get_frozen_credentials

python - 我可以在 Django 测试中避免 permission_required 装饰器吗?

Python:将绑定(bind)方法更改为另一种方法

python - Linux下GUI设计模式的有效性