我在登录的用户和Django ModelForm 我有一个名为_Animal_的类,该类具有UserForeignKey以及一些与动物相关的数据,例如年龄,种族等。

用户可以将动物添加到数据库,并且我必须跟踪每个动物的作者,因此我需要添加在用户创建动物实例时记录的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)

===============>>#1 票数: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子句-紧跟在重定向之后的行-是不必要的。如果省略它,执行将落入视图末尾的两行,它们是相同的。)

===============>>#2 票数: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()

===============>>#3 票数: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)

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

  ask by amb translate from so

未解决问题?本站智能推荐:

1回复

Django:无法保存表单(ModelForm通过request.user过滤ForeignKey选择)

我设法通过下面的代码通过“ request.user”过滤了ForeignKey选择“ Context.name”。 首先,我定义了模型。 models.py class Extension(models.Model): username = models.CharField(p
1回复

在Django的选择小部件中可以选择request.user

我有一个模特领域 我也有一个ModelForm 。 我希望用select小部件来表示该字段。 这将是 有用。 但是我希望select小部件只有两个选择true (1)和false (0),并且每个选项中表示的文本对于true应当为Anonymous ,对于false应当
1回复

Django表单在ManyToMany字段中保存request.user

我有一个简单的组模型,可以添加用户。 我有一个基本的组CreateView 。 创建组的登录用户将保存在created_by 。 但是,我也想将相同的登录用户保存在现场users以便他可以作为组的普通成员参加。 问题是视图最终只能保存已登录的用户,而不会保存从表单字段users传入
1回复

Django ModelForm未在模板中呈现

我在这里查看了几个答案,但无法正常工作。 我正在尝试创建一个模型表单,该表单将在用户注册网站后保存用户的个人资料。 问题是,当我尝试呈现表单时,我得到了空白页并且没有错误。 任何帮助都感激不尽。 models.py forms.py views.py 最后是我
1回复

我收到“此字段必填。” 使用Django ModelForm时网页加载错误

我在models.py文件中创建了一个名为Annoucement的模型,在forms.py文件中也创建了一个模型。 然后,我在我的views.py中为其创建了简单的create视图,并使用django-crispy-forms程序包将其显示在前端,但是无论何时加载网站,该字段的边框都会显示为红色,表
1回复

ImageField()没有在ModelForm中保存图像 - Django / Python

当我尝试从表单上传图片时,一切都会处理,但图像没有保存。 有谁知道为什么会这样? 提前谢谢! models.py: views.py: forms.py: html的:
1回复

Django ModelForm未检索字段的值

我正在使用两个ModelForms创建一个带有Profile实例的用户。 Profile ModelForm具有单个字段。 我正在做form.save(commit = False),设置表单中的那个字段以外的必填字段(国家/地区)并保存。 我收到一条错误消息,说“ country_id”
1回复

在Django中合并两个ModelForm字段

我有一个具有布尔字段和外键的模型 我想将这两个字段组合在一个选择字段中。 它应该具有选项<option value="anonymous">Anonymous</option>和ModelB每个对象的选项。 因此,如果在<select>选择
1回复

无法从Django ModelForm保存到数据库

没有错误,但是表单没有保存到数据库。 否则,可以从django admin添加数据。 网址和重定向也可以正常工作,我可以打开表单,编辑/放入数据并点击提交,但数据库无法反映出来。 models.py views.py 表格 模板 最后这是我的admi
1回复

使用包含RadioSelect小部件的ModelChoiceField在ModelForm中的queryset中获取request.user

我想问一下社会关于通过以下request.user的queryset中ModelForm 。 我的ModelForm是: 同 我找到的所有答案都是指将request.user传递给__init__或者使用筛选选项填充视图中的goForm 。 但是似乎没有任何在我的情况下工作,