#django #django-models #django-forms
#django #django-модели #django-формы
Вопрос:
У меня есть представление, которое редактирует экземпляр model Foo . Он вызывается либо с одним аргументом (сообщение формы), либо с тремя аргументами (первоначальный запрос на редактирование объекта):
def edit_it(request, key1_id=-1, key2_id=-1):
где key1_id
и key2_id
укажите конкретный экземпляр для редактирования. При вводе я проверяю, был ли я вызван из сообщения формы или из ссылки
if request.method == 'POST':
key1_id = request.key1_id # first thing that doesn't work
key2_id = request.key2_id # (also doesn't work)
foo = Foo.objects.get(key1=key1_id, key2=key2_id)
form = Foo(request.POST, instance=foo)
...
else:
foo = Foo.objects.get(key1=key1_id, key2=key2_id)
form = Foo(instance=foo)
В моем шаблоне я явно вставляю <input type="hidden" ... >
для key1_id
и key2_id
. Поэтому кажется разумным, что key1_id и key2_id должны быть в запросе.ОПУБЛИКУЙТЕ где-нибудь, но я не нашел его, просматривая код, документы и Google.
Или я полностью запутался, и я должен сделать это по-другому? Я попытался указать поля key[12] _id в модели с "widget=forms.HiddenInput"
помощью , но widget здесь не работает: key1_id
это первичный ключ и key2_id
ForeignKey, задача которого — просто избегать поиска объектов других людей путем изменения key1_id
URL.
Полученный HTML-код (теперь слегка измененный благодаря предложению сохранить аргументы в сообщении) таков:
<table>
<form action="/seededit/u=2/sh=14" method="post">
<div style='display:none'>
<input type='hidden' name='csrfmiddlewaretoken'
value='19a559c496e637cdbf3132ce8e147cc4' /></div>
[...]
<tr>
<td><input type="hidden" name="user_id" value="2" />
<input type="hidden" name="shareable_id" value="14" /></td>
<td><input type="submit" value="Submit" name="submit" /></td>
</tr>
</form>
</table>
</p>
Комментарии:
1. Можете ли вы показать нам все от открытия
<form>
до закрытия</form>
? Это сузит количество потенциальных проблем.2. Почему бы не опубликовать вашу форму в URL с помощью key_1 и key_2, как вы делаете со ссылкой редактирования?
3. @RobAllen — <действие формы =»/seededit» метод =»post»> … <tr> <td><тип ввода = «скрытый» имя =»идентификатор пользователя» значение = «2» />/> </td> <td><тип ввода= «отправить» значение = «Отправить» имя =»отправить» /> </td> </ tr> </форма>
4. Я вижу, что <form> и <table> меняются местами (последовательно), но это не должно быть проблемой для django.
5. Поскольку никто не упоминал об этом:
request.key1_id
andrequest.key2_id
не работают, потому что они не являются атрибутамиrequest
; это прямые аргументы, которые были переданы вашему представлению, поэтому вы ссылаетесь на них просто какkey1_id
на andkey2_id
.
Ответ №1:
Это не request.key2_id
запрос It request.POST['key2_id
]`.POST — это QueryDict, который действует как словарь, поэтому печатает запрос.POST покажет вам словарь.
При этом вы все равно можете использовать / определять эти файлы как HiddenInput, а затем использовать проверку формы django, чтобы убедиться, что они имеют правильный тип / существуют и т.д. Существует множество вариантов, когда дело доходит до обработки форм, переменных запроса и проверки.
Комментарии:
1. Хорошо, спасибо за подведение итогов. Решение, которое я выбрал, которое было очень простым, заключалось в том, чтобы встроить данные в URL, как это было предложено Дэниелом Роземаном в комментариях к исходному вопросу. Это не привело бы к необходимости большого количества данных, но для простого указателя на то, к какому объекту обращается текущая форма, это очень просто.
2. Да, это то, что я тоже делаю большую часть времени.