Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB
Jan. 27, 2019, 4:49 p.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>

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

5
  • Jan. 27, 2019, 5: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. Похоже я не так понял документацию.?

0

Добрый день!

Для 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 предназначен только для обного объекта.

0
  • Jan. 28, 2019, 7:24 a.m.

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

0

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

А вообще у вас подход неправильный к данном вопросу. Вы не можете на одной странице разместить два 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
            }
        )
0
  • Jan. 28, 2019, 8:36 a.m.

Спасибо.

0

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Last comments
Feb. 21, 2019, 12:51 p.m.
Евгений Легоцкой

Иногда CMake приходится перезапускать начисто, не обновляет кэш
R
Feb. 21, 2019, 12:29 p.m.
RandyGallup

Я указал данные строки, т.к. без них у меня вылетала следующая ошибка: By not providing "FindQt5Core.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configurat...
Feb. 21, 2019, 12:08 p.m.
BlinCT

Вот атк выглядит мой проектник, посмотрите его. cmake_minimum_required(VERSION 3.6)project(projecttimer)set(CMAKE_CXX_STANDARD 11)set(CMAKE_AUTOMOC ON)set(CMAKE_AUTORCC ON)find_packa...
Feb. 21, 2019, 12:04 p.m.
BlinCT

Смотрите, если вы используете глобально для проекта -DCMAKE_PREFIX_PATH= то вам не надо уже указывать вот эти строкиset(Qt5Core_DIR "C:/Qt/5.12.1/mingw73_64/lib/cmake/Qt5Core")set(Qt5Gui_DIR...
R
Feb. 21, 2019, 11:54 a.m.
RandyGallup

Даже не запускается. main.cpp у меня точно такой же, как в статье. CMakeLists.txt пришлось немного подправить (прикрепил ниже), т.к. не находились некоторые файлы. cmake_minimum_requi...
Now discuss on the forum
Feb. 21, 2019, 8:58 a.m.
Евгений Легоцкой

Ну у меня координаты передавались в зависимости от положения курсора мыши, а в вам по сути нужно будет аналогичным способом посылать даннные из полей ввода. Так что здесь скорее интерфес...
Feb. 20, 2019, 9:55 p.m.
Евгений Легоцкой

Не до конца понимаю сути вопроса, наверное, нужно увидеть программный код и попытку его применения, но к методам базового класса можно обращаться в наследованном классе через вызов по имени ба...
MU
Feb. 20, 2019, 3:06 p.m.
Maciej Urmański

Yes, ok I have solution! Thank you for directing me about annotate.:) Solution is: users_in = User.objects.filter(joined_users__goal=goal, joined_users__joined=True)
Feb. 20, 2019, 2:40 p.m.
Евгений Легоцкой

Думаю, что ещё можно переопределить mouseReleaseEvent(QMouseEvent* event) у QTableView, который содержит модель и немного поиграться с индексом. Если это индекс, который соответству...
Feb. 20, 2019, 10:34 a.m.
Евгений Легоцкой

Да, так тоже можно. Единственный момент в том, что lupdate не всегда понимает, к какому контексту это дело относится, и может запихать в левый контекст. В небольшом проекте это не критич...
Join us in social networks

For registered users on the site there is a minimum amount of advertising