为了账号安全,请及时绑定邮箱和手机立即绑定

UpdateView 不使用现有数据填充表单

UpdateView 不使用现有数据填充表单

largeQ 2021-10-10 14:00:00
因此,我将 UpdateView 设置为向request表单发送对象,以便我可以修改表单中的查询集(基于request.user)我的意见.py:class DataSourceUpdateView(UpdateView):    model = DataSource    form_class = DataSourceForm    template_name = 'engine/datasource_update.html'    def get(self, request, *args, **kwargs):        obj = DataSource.objects.get(pk=kwargs['pk'])        self.object = None        form = DataSourceForm(request)        return self.render_to_response(            self.get_context_data(form=form,                                  object=obj))    def post(self, request, *args, **kwargs):        form = DataSourceForm(request, request.POST, request.FILES)        if form.is_valid:            return self.form_valid(form)        else:            return self.form_invalid(form)  我的forms.py:class DataSourceForm(forms.ModelForm):    def __init__(self, request, *args, **kwargs):        self.request = request        super(DataSourceForm, self).__init__(*args, **kwargs)          self.fields['dataset_request'].queryset = DatasetRequest.objects.filter(            creator=self.request.user)    class Meta:        model = DataSource        exclude = ('creator', 'vote_score', 'num_vote_up',                   'num_vote_down', 'file_size', 'slug')我的问题是,在模板中,表单未填充现有值。我怎样才能解决这个问题?
查看完整描述

1 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

随着UpdateView这是一个有点棘手。因此,为了初始化表单的数据,您需要在视图本身而不是在表单中进行初始化。


所以这里是你如何执行你在使用时所做的事情UpdateView:


class DataSourceUpdateView(UpdateView):

    model = DataSource

    form_class = DataSourceForm

    template_name = 'engine/datasource_update.html'

    # An empty dict or add an initial data to your form

    initial = {}

    # And don't forget your success URL

    # or use reverse_lazy by URL's name

    # Or better, override get_success_url() method

    # And return your success URL using reverse_lazy

    sucess_url = '/' 


    def get_initial(self):

        """initialize your's form values here"""


        base_initial = super().get_initial()

        # So here you're initiazing you're form's data

        base_initial['dataset_request'] = DatasetRequest.objects.filter(

            creator=self.request.user

        )

        return base_initial


        #... The rest of your view logic

你的形式将是:


class DataSourceForm(forms.ModelForm):


    class Meta:

        model = DataSource

        exclude = (

            'creator',

            'vote_score',

            'num_vote_up',

            'num_vote_down',

            'file_size',

            'slug'

        )

奖金:

为了理解为什么需要初始化表单的数据,您需要查看`UpdateView's MRO,请访问此文档链接

  • ...

  • django.views.generic.edit.FormMixin # => 这个是处理表单

  • ...

并且FormMixin有这些属性和方法请访问文档链接,它们是:

  • initial:包含表单初始数据的字典。...

  • get_initial():检索表单的初始数据。默认情况下,返回初始值的副本。

此外,我建议您查看FormMixin它们的属性和方法,以便了解如何覆盖它们或让 Django 为您施展魔法:D。请参阅此文档链接


查看完整回答
反对 回复 2021-10-10
  • 1 回答
  • 0 关注
  • 281 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号