首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Django ModelForm中使用request.user

在Django ModelForm中使用request.user
EN

Stack Overflow用户
提问于 2011-12-12 03:27:24
回答 4查看 15.5K关注 0票数 22

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

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

models.py

代码语言:javascript
复制
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

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

我可以使用initial捕捉视图中的当前用户,但我还希望不显示该字段。

views.py

代码语言:javascript
复制
@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)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-12 04:34:18

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

代码语言:javascript
复制
class AnimalForm(ModelForm):
    class Meta:
        model = Animal
        exclude = ('publisher',)

..。在视图中:

代码语言:javascript
复制
    form = AnimalForm(request.POST)
    if form.is_valid():
        animal = form.save(commit=False)
        animal.publisher = request.user
        animal.save()

(还要注意,第一个else子句-紧跟在重定向之后的行-是不必要的。如果省略它,执行将会落到视图末尾的两行,这两行是完全相同的。)

票数 43
EN

Stack Overflow用户

发布于 2013-01-04 21:00:06

另一种方式(略短):

您还需要排除该字段:

代码语言:javascript
复制
class AnimalForm(ModelForm):
    class Meta:
        model = Animal
        exclude = ('publisher',)

然后在视图中:

代码语言:javascript
复制
animal = Animal(publisher=request.user)  
form = AnimalForm(request.POST, instance=animal)
if form.is_valid():
     animal.save()
票数 9
EN

Stack Overflow用户

发布于 2018-08-06 23:56:52

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8466768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档