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

因此,我将 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')

我的问题是,在模板中,表单未填充现有值。我怎样才能解决这个问题?


largeQ
浏览 282回答 1
1回答

喵喵时光机

随着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。请参阅此文档链接
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python