Arrow
ArrowJan. 27, 2019, 11:49 a.m.

Изменить имя формы в template для UpdateView

UpdateView, html, template

Добрый день!

На одной html странице нужно разместить два UpdateView. Для этого имя формы для одного хочу изменить на update_form, а второе на upd_form.

Стандартно в html файле UpdateView для формы использует имя form.

Код формы в html:

<form action="." method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button class="btn btn-outline-info" type="submit" value="Save">Add</button>
    <a href="{% url 'home' %}" class="ml-2 mt-2">Cancel</a>
</form>

В документации указано что для изменения этого имени нужно указать context_object_name.

Пробовал так (views.py):

class DataUpdateView(LoginRequiredMixin, UpdateView):
    template_name = 'index.html'
    form_class = MyForm
    context_object_name = 'update_form' ###

    def get_object(self):
        return get_object_or_404(Project, id=self.kwargs.get('id'))

    def form_valid(self, form):
        return super().form_valid(form)

    def get_context_data(self, *args, **kwargs):
        context = super(ProjectUpdateView, self).get_context_data(*args, **kwargs)
        data = filter(self.request)
        context.update(data)
        return context

html:

<form action="." method="POST">
    {% csrf_token %}
    {{ update_form.as_p }}
    <button class="btn btn-outline-info" type="submit" value="Save">Add</button>
    <a href="{% url 'home' %}" class="ml-2 mt-2">Cancel</a>
</form>

Не работает. Возможно я что-то не так понял?

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

5
Arrow
  • Jan. 27, 2019, 12:10 p.m.
  • (edited)

Посмотрел на то что получается в get_context_data:

def get_context_data(self, *args, **kwargs):
    context = super(ProjectUpdateView, self).get_context_data(*args, **kwargs)
    print('Context:', context)

Вывод:

Context: {'object': <Project: ProjName>, 'update_form': <Project: ProjName>,
          'form': <MyForm bound=False, valid=Unknown, fields=(data;name)>,
          'view': <myList.views.DataUpdateView object at 0x7f36966e4588>}

form осталась и добавилось update_form.
Похоже я не так понял документацию.?

    Evgenii Legotckoi
    • Jan. 28, 2019, 2:10 a.m.
    • (edited)

    Добрый день!

    Для UpdateForm наименование _update_form - это постфикс. Зависимость имени шаблона состоит из имени модели и постфикса. Если модель называется Article, то имя шаблона будет такое article_update_form.html .

    При этом, если ва нужно изменить постфикс на что-то иное, то можно написать так

    class DataUpdateView(LoginRequiredMixin, UpdateView):
        template_name_suffix = '_my_update_form'
    

    Тогда название шаблона будет следующим

    article_my_update_form.html

    А context_object_name - это то под каким именем будет передаваться объект в рендер шаблона. Я обычно стараюсь не переопределять его, поскольку подхожу абстрагированно к объекту. То есть если

    context_object_name = 'article_object'

    То в шаблоне можно будет обращаться к текущей редактируемой статье по имени article_object

    А что касается двух форм, то делайте это в обычном View, поскольку UpdateView предназначен только для обного объекта.

      Arrow
      • Jan. 28, 2019, 2:24 a.m.

      О template_name_suffix я знал. Хотел именно переопределить то, как вызывать форму в шаблоне (файл *.html). Вместо form писать update_form.
      За информацию о context_object_name спасибо.

        Evgenii Legotckoi
        • Jan. 28, 2019, 2:36 a.m.
        • (edited)

        Не помню, чтобы стандартным способом имя там переопределялось.

        А вообще у вас подход неправильный к данном вопросу. Вы не можете на одной странице разместить два UpdateView. UpdateView отвечает за рендеринг всей страницы страницы в данном случае, если бы вы через ajax забирали кусочки страницы то ещё куда ни шло так говорить, и то, каждый UpdateView отвечал бы лишь за одну форму.

        Если вы хотите разместить на одной странице две формы, то одну форму нужно рендерить через стандартые средства UpdateView, а вторую подмешивать через переопределение всех методов типо get и т.д. Честно, проще взять для такого обычный View и обрабатывать две формы вручную.

        У меня есть одна такая ситуация, делаю так

        class EditMain(View):
            template_name = 'users/edit/main.html'
            title = _('Edit')
        
            def get(self, request):
                return render(
                    request=request,
                    template_name=self.template_name,
                    context={
                        'title': self.title,
                        'user_form': forms.UserForm(instance=request.user),
                        'profile_form': forms.ProfileForm(author=request.user, instance=request.user.userprofile)
                    }
                )
        
            def post(self, request):
                user_form = forms.UserForm(data=request.POST, instance=request.user)
                profile_form = forms.ProfileForm(author=request.user, data=request.POST, files=request.FILES, instance=request.user.userprofile)
        
                if user_form.is_valid() and profile_form.is_valid():
                    user_form.save()
                    profile_form.save()
                    return redirect(reverse('users:edit_main'))
        
                return render(
                    request=request,
                    template_name=self.template_name,
                    context={
                        'title': self.title,
                        'user_form': user_form,
                        'profile_form': profile_form
                    }
                )
        
          Arrow
          • Jan. 28, 2019, 3:36 a.m.

          Спасибо.

            Comments

            Only authorized users can post comments.
            Please, Log in or Sign up
            AD

            C ++ - Test 004. Pointers, Arrays and Loops

            • Result:50points,
            • Rating points-4
            m

            C ++ - Test 004. Pointers, Arrays and Loops

            • Result:80points,
            • Rating points4
            m

            C ++ - Test 004. Pointers, Arrays and Loops

            • Result:20points,
            • Rating points-10
            Last comments
            i
            innorwallNov. 15, 2024, 5:44 a.m.
            Qt/C++ - Lesson 039. How to paint stroke in QSqlTableModel by value in the column? Many OPKs would advise users to start using the test strips around day 9 of your cycle, considering day 1 to be the first day of full menstrual flow buy priligy australia
            i
            innorwallNov. 15, 2024, 2:27 a.m.
            Release of C++/Qt and QML application deployment utility CQtDeployer v1.4.0 (Binary Box) optionally substituted alkoxy, optionally substituted alkenyloxy, optionally substituted alkynyloxy, optionally substituted aryloxy, OCH, OC H, OC H, OC H, OC H, OC H, OC H, O C CH, OCH CH OH, O…
            i
            innorwallNov. 14, 2024, 9:26 p.m.
            Qt/C++ - Lesson 031. QCustomPlot – The build of charts with time buy generic priligy We can just chat, and we will not lose too much time anyway
            i
            innorwallNov. 14, 2024, 7:03 p.m.
            Qt/C++ - Lesson 060. Configuring the appearance of the application in runtime I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
            i
            innorwallNov. 14, 2024, 12:07 p.m.
            Circuit switching and packet data transmission networks Angioedema 1 priligy dapoxetine
            Now discuss on the forum
            t
            tonypeachey1Nov. 15, 2024, 6:04 a.m.
            google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
            i
            innorwallNov. 15, 2024, 5:50 a.m.
            добавить qlineseries в функции priligy for sale Gently flush using an ear syringe
            i
            innorwallNov. 11, 2024, 10:55 a.m.
            Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
            9
            9AnonimOct. 25, 2024, 9:10 a.m.
            Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

            Follow us in social networks