gpt4 book ai didi

Django 自动在表单中设置外键(使用基于类的 View )

转载 作者:行者123 更新时间:2023-12-04 22:31:06 24 4
gpt4 key购买 nike

我想使用一个表单从一个人的页面生成一个新对象(比如一本书),这样新书就会通过外键自动与那个人关联,但是我在正确关联和保存这个人时遇到了麻烦表格。对于我的模型,我有:

class Person(models.Model):
p_id = models.PositiveIntegerField(primary_key=True, unique=True)

class Book(models.Model):
person = models.ForeignKey(Person)
title = models.CharField(max_length=100)

然后我有一个自定义表单来创建一本书:
class AddBookForm(forms.ModelForm):
class Meta:
model = Book
fields = ('title', 'person',)
widgets = {
'person': forms.HiddenInput,
}

以及创建 Book 的 View (也给出了 Person 的 pk ( p_id )):
class AddBook(CreateView):
model = Book

我尝试了各种方法来让它发挥作用:
  • 使用 get_initial 预填充 Person 字段,但由于某种原因,输入设置为隐藏(令人沮丧),这会消失。
  • 修改 View 中的 form_valid 方法,但是这只会在表单已经验证之后发生,所以我需要在此之前添加 Person 。
  • 修改表单类中的 clean_person 方法,但只有在表单被 clean 方法验证后才会发生。

  • 目前,我正在尝试覆盖 clean 方法。但是,在表单已经发送进行清洁之后,此时我不知道如何获取 Person。在 View 中,我可以使用 Patient.objects.get(p_id=self.kwargs.get('pk')) 访问它。

    有什么方法可以在我的 View 中将数据添加到表单中(作为基于类的 View ),它不会被剥离 有什么方法可以在此时访问 Person 或 p_id 外键在 clean 方法中添加数据?

    最佳答案

    你走错了路:这个人不是用户输入,所以这些信息不应该存在于表单中。您可以按如下方式覆盖 form_valid 方法:

    class AddBook(CreateView):
    model = Book

    def form_valid(self, form):
    form.instance.person_id = self.kwargs.get('pk')
    return super(AddBook, self).form_valid(form)

    这将在表单使用的实例上设置 person_id 属性以保存数据,然后调用 super 方法保存该实例并返回重定向。

    关于Django 自动在表单中设置外键(使用基于类的 View ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24813496/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com