【问题标题】:How do I set initial data on a Django class based generic createview with request data如何使用请求数据在基于 Django 类的通用 createview 上设置初始数据
【发布时间】: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 中的请求并将其传递给表单?

【问题讨论】:

    标签: django django-forms django-generic-views django-class-based-views


    【解决方案1】:

    首先,您不需要在那里使用 mixin。只需在PersonCreateView 中指定form_class;也不需要模型,因为您已经在 form_class 中指定了它(假设是 ModelForm 的子类)。

    关于从哪里获取请求,基于类的视图将其保存在对象中,因此您可以在 get_initialget_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下添加了它,没有任何反应。
    猜你喜欢
    • 2011-08-05
    • 2016-03-31
    • 2013-06-26
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    相关资源
    最近更新 更多