UpdateView не заполняет форму существующими данными - PullRequest
0 голосов
/ 13 января 2019

Итак, мой UpdateView настроен на отправку объекта request в форму, чтобы я мог изменить набор запросов в форме (на основе request.user)

my views.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)  

my 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 Ответ

0 голосов
/ 13 января 2019

С 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'
        )

Бонус:

Чтобы понять, почему вам нужно инициализировать данные формы, вам нужно увидеть MRO UpdateView, которые Посетите эту ссылку документации :

  • ...
  • django.views.generic.edit.FormMixin # => Этот имеет дело с формой
  • ...

И у FormMixin есть эти атрибуты и методы Посетите ссылку на документацию :

  • initial : словарь, содержащий начальные данные для формы. ...
  • get_initial () : получение исходных данных для формы. По умолчанию возвращает копию исходного текста.

Также я рекомендую вам посмотреть, что FormMixin имеет подобные атрибуты и методы, чтобы увидеть, как вы можете переопределить их или позволить Django создавать магию для вас: D. См. документацию по ссылке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...