Форум программистов, компьютерный форум, киберфорум
Python: Django
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
 Аватар для netBool
325 / 304 / 173
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9

Передать request в ModelForms

14.01.2019, 15:41. Показов 1992. Ответов 1

Студворк — интернет-сервис помощи студентам
Всем привет

Мне как-то лень писать в каждом template такую конструкцию:

HTML5
1
2
3
4
    <form method="post">{% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="Присоединиться">
    </form>
и решил сократить ее до простого

HTML5
1
{{ form }}
А для этого я переопределил as_p и добавил вручную туда нужные мне теги:

Python
1
        html = '<form method="post">' + self.as_p() + '<input type="submit" value=' + self.submit + '></form>'
В целом на выходе я получаю то, что хочу. За исключением одной маленькой, но ключевой детали - csrf_token-а. Мне как-то надо засунуть вывод csrf-токена в эту строку в таком виде

Python
1
        html = '<form method="post">' + csrf + self.as_p() + '<input type="submit" value=' + self.submit + '></form>'
где csrf - это скрытое поле csrf. Собственно, с созданием скрытого поля проблем нет. Проблема у меня с получением самого токена:

В исходниках джанго я нашел функцию csrf:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def csrf(request):
    """
    Context processor that provides a CSRF token, or the string 'NOTPROVIDED' if
    it has not been provided by either a view decorator or the middleware
    """
    def _get_val():
        token = get_token(request)
        if token is None:
            # In order to be able to provide debugging info in the
            # case of misconfiguration, we use a sentinel value
            # instead of returning an empty dict.
            return 'NOTPROVIDED'
        else:
            return force_text(token)
 
    return {'csrf_token': SimpleLazyObject(_get_val)}
Она должна вернуть тот самый csrf_token, но для этого ей надо передать request.

Пересмотрев все варианты, я не нашел ничего лучше, чем создать в классе формы еще одно поле, куда передавать этот request, чтобы потом внутри моего метода вывода формы я мог воспользоваться функцией csrf(request) либо get_token(request) из django.middleware.csrf.

А вот теперь самое интересное. В качестве view-х я использую cbv-классы. В частности, CreateView. Собственно вопрос, как из CreateView передать request в привязанную django-форму? В частности его можно разделить на два: первый - как это сделать красиво? И второй - как это сделать хоть как-то?

Из моих попыток: пытался сделать через переопределение dispatch, но не понял, как получить форму. В исходниках подсмотрел, что сама форма в моделформс создается методом get_form() внутри get_context_data:

Python
1
2
3
4
5
6
7
    def get_context_data(self, **kwargs):
        """
        Insert the form into the context dict.
        """
        if 'form' not in kwargs:
            kwargs['form'] = self.get_form()
        return super(FormMixin, self).get_context_data(**kwargs)
Короче говоря, пока писал, сам догадался. Но решил все же опубликовать. незря ж минут 15 печатал. Мало ли, кому пригодится:

Python
1
2
3
4
    def get_context_data(self, **kwargs):
        context = super(Create, self).get_context_data(**kwargs)
        context['form'].request = self.request
        return context
PS: Спасибо за внимание
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.01.2019, 15:41
Ответы с готовыми решениями:

Request.Response ошибка 400 bad request
Добрый день! Прошу помочь с обработкой запросов в Python 2.7.11 Принимать реквест и сохранить на сервере файл из него уже...

Requests: Как передать в post запрос request payload данные
Хочу получить ответ на post запрос. В запросе есть (см. вложение) request payload dataraw={ &quot;take&quot;: &quot;40&quot;, ...

Можно ли как-нибудь передать значение из HTTP Request в переменную?
Можно ли как-нибудь передать значение из Authorization в переменную JS, как на рисунке?

1
 Аватар для Wi0M
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
18.01.2019, 22:44
есть вот такая штука, а есть вот такая
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.01.2019, 22:44
Помогаю со студенческими работами здесь

переопределение виджетов ModelForms в джанго
как переопределить виджет таким образом чтоб добавить свойства каждому обьекту ? к примеру добавить класс с именем input. Как для CharField...

Не могу передать параметр через request и session (JBoss+Tomcat+Struts)
Всем привет! Ситуация: На компе стоит JBoss+Tomcat+Struts. Не могу передать параметр на jsp с вызывающего ее Action. Пробовал и...

Как передать большой файл в WCF? wcf Выдает ошибку 413 request entity too large
При попытке передать файл размером 81кб выдает ошибку,а файл размером 2800б передался успешно, как увеличить максимальный размер...

request->flash() и request->validate() не могут работать в теле одной функции?
Всем привет. Есть простенький скрипт и простенькое представление с формой, для которой используется валидация. Код ниже. Контроллер: ...

Требуется проверить вызывался ли Request.Form перед тем как вызвать Request.BinaryRead
Требуется проверить вызывался ли Request.Form перед тем как вызвать Request.BinaryRead


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru