Python 将request.user与Django ModelForm一起使用

Python 将request.user与Django ModelForm一起使用,python,django,django-forms,django-views,Python,Django,Django Forms,Django Views,我遇到了登录用户和DjangoModelForm的问题。我有一个名为\u Animal的类,它有一个到用户的外键,还有一些与动物相关的数据,如年龄、种族等 用户可以将动物添加到数据库中,我必须跟踪每个动物的作者,因此我需要添加用户创建动物实例时记录的请求。user 型号.py class Animal(models.Model): name = models.CharField(max_length=300) age = models.PositiveSmallIntegerFi

我遇到了登录用户和Django
ModelForm
的问题。我有一个名为
\u Animal
的类,它有一个到
用户的
外键
,还有一些与动物相关的数据,如年龄、种族等

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

型号.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
@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)
主要目标是在表单中隐藏publisher字段,并在点击save按钮时提交已登录的用户

我可以使用
initial
在视图中捕获当前用户,但我也不希望显示该字段

视图.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
@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)

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

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()
animal = Animal(publisher=request.user)  
form = AnimalForm(request.POST, instance=animal)
if form.is_valid():
     animal.save()
(还请注意,第一个
else
子句(重定向后的行)是不必要的。如果不使用它,执行将落到视图末尾的两行,这两行是相同的。)

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

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()
animal = Animal(publisher=request.user)  
form = AnimalForm(request.POST, instance=animal)
if form.is_valid():
     animal.save()

我会直接将其添加到表格中:

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)

在我看来,这是最干净的版本,您可以在不同的视图中使用表单。

用户
django.contrib.auth.models的一个实例
?遗憾的是,这将不起作用(不再?),因为您无法访问
ModelForm.save()中的
self.request
您使用的是什么django版本?在这个版本中是django 2.1case@melbic为什么会出现错误:
“AnimalForm”对象没有属性“request”
?…我需要导入一些东西才能使其工作吗?可能在较新的django版本中不再工作了。我可能使用了1.11版……请您解释一下这行代码的作用:
animal=form.save(commit=False)
?这是一个更好的答案。此处的
表单有效
正确调用
models.clean()
,并且可以访问
publisher
字段。在另一个答案中,该检查处的
publisher
字段还不可用,因此无法使用DB
clean()
验证,并强制在表单级别进行验证。