如何使用请求数据在基于 Django 类的通用 createview 上设置初始数据
Posted
技术标签:
【中文标题】如何使用请求数据在基于 Django 类的通用 createview 上设置初始数据【英文标题】:How do I set initial data on a Django class based generic createview with request data 【发布时间】:2012-10-22 05:16:39 【问题描述】:我为我的模型使用了 Django 的通用 createview
from myproject.app.forms import PersonForm
class PersonMixin(object):
model = Person
form_class = PersontForm
class PersonCreateView(PersonMixin, CreateView):
pass
这非常适合使用我的自定义表单显示 Person 的创建视图。但是,我在表单中有一个字段,我想用一个值预先填充。我找到了这个答案:Set initial value to modelform in class based generic views
但是,我预先填充的值来自 request.user 的配置文件。如何访问 PersonCreateView 中的请求并将其传递给表单?
【问题讨论】:
【参考方案1】:首先,您不需要在那里使用 mixin。只需在PersonCreateView
中指定form_class
;也不需要模型,因为您已经在 form_class
中指定了它(假设是 ModelForm
的子类)。
关于从哪里获取请求,基于类的视图将其保存在对象中,因此您可以在 get_initial
或 get_form_kwargs
中执行 self.request.user。
【讨论】:
我实际上在其他通用视图中使用了这个 PersonMixin,这就是它分开的原因,但我很欣赏这个建议,我不知道我可以放弃模型,因为我指定了 form_class。 是的,我在发布后发现了这一点,但我仍然建议不要像那样使用 Mixins,除非完全必要(基于类的视图并不罕见,但如果只是为了重用几个属性定义那么不值得)。 你为什么这么说?我从来没有对不利的一面做出太多贡献,但也许我错过了什么? 多重继承通常不是一个好主意(尽管在特定情况下非常有用):它增加了代码的复杂性,使其可读性降低,有时还会产生不直观的行为。因此,根据经验,除非我有充分的理由,否则我宁愿不使用它。【参考方案2】:在任何类方法中,您都可以使用 self.request 访问请求。因此,您的用户个人资料将可以通过 self.request.user 访问。
基于您提供的链接,您将能够在 get_initial 方法中使用 self.request.user 来设置值。
即。
def get_initial(self):
return 'value1': self.request.user
【讨论】:
你在哪里添加这段代码? 我在form_valid下添加了它,没有任何反应。以上是关于如何使用请求数据在基于 Django 类的通用 createview 上设置初始数据的主要内容,如果未能解决你的问题,请参考以下文章