一尘不染

在Django ModelForm上使用request.user

django

我在登录用户和Django时遇到问题ModelForm。我有一个名为的类_Animal_,该类具有ForeignKeyto User和与该动物有关的一些数据,例如年龄,种族等。

用户可以将动物添加到数据库,并且我必须跟踪每个动物的作者,因此我需要添加在用户创建动物实例时记录的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,但是我也想要不显示该字段。

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)

阅读 727

收藏
2020-04-02

共1个答案

一尘不染

你只需要从表单中排除它,然后在视图中进行设置即可。

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子句(紧随重定向之后的各行)是不必要的。如果不加说明,执行将落入视图末尾的两行,它们是相同的。)

2020-04-02