将request.user与Django ModelForm一起使用

amb*_*amb 18 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
Run Code Online (Sandbox Code Playgroud)

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

我可以在视图中捕获当前用户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)
Run Code Online (Sandbox Code Playgroud)

Dan*_*man 35

您只需要从表单中排除它,然后在视图中设置它.

class AnimalForm(ModelForm):
    class Meta:
        model = Animal
        exclude = ('publisher',)
Run Code Online (Sandbox Code Playgroud)

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

    form = AnimalForm(request.POST)
    if form.is_valid():
        animal = form.save(commit=False)
        animal.publisher = request.user
        animal.save()
Run Code Online (Sandbox Code Playgroud)

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


mat*_*ino 8

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

class AnimalForm(ModelForm):
    class Meta:
        model = Animal
        exclude = ('publisher',)
Run Code Online (Sandbox Code Playgroud)

然后在视图中:

animal = Animal(publisher=request.user)  
form = AnimalForm(request.POST, instance=animal)
if form.is_valid():
     animal.save()
Run Code Online (Sandbox Code Playgroud)