将request.user与Django ModelForm一起使用

时间:2011-12-11 19:27:24

标签: python django django-forms django-views

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

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

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在视图中捕获当前用户,但我还想要的是不显示该字段。

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)

4 个答案:

答案 0 :(得分:35)

您只需要将其从表单中排除,然后在视图中进行设置。

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

......并且在视图中:

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

(另请注意,第一个else子句 - 紧接在重定向之后的行 - 是不必要的。如果将其遗漏,执行将落到视图末尾的两行,这两行是相同的。)

答案 1 :(得分:8)

另一种方式(略短):
您还需要排除该字段:

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

然后在视图中:

animal = Animal(publisher=request.user)  
form = AnimalForm(request.POST, instance=animal)
if form.is_valid():
     animal.save()

答案 2 :(得分:0)

我将其直接添加到表单中:

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

    def save(self, commit=True):
        self.instance.publisher = self.request.user
        return super().save(commit=commit)

我认为这是最干净的版本,您可以在不同的视图中使用该表格。

答案 3 :(得分:0)

如果您使用的是 ModelAdmin 您应该在 ModelAdmin 上添加 get form 方法

private_ip

您现在可以在 ModelForm 中访问请求

class BlogPostAdmin(admin.ModelAdmin):
    form = BlogPostForm

    def get_form(self, request, **kwargs):
        form = super(BlogPostAdmin, self).get_form(request, **kwargs)
        form.request = request
        return from