簡體   English   中英

UpdateView 不使用現有數據填充表單

[英]UpdateView not populating form with existing data

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

我的問題是,在模板中,表單未填充現有值。 我怎樣才能解決這個問題?

使用UpdateView有點棘手。 因此,為了初始化表單的數據,您需要在視圖本身而不是在表單中進行初始化。

因此,以下是您在使用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 為您FormMixin魔法:D。 請參閱此文檔鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM