У меня есть вид, который редактирует экземпляр модели 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 должны быть где-то в request.POST, но я не нашел, чтобы он копался в коде, документах и Google.Я попытался указать ключевые поля [12] _id в модели с помощью "widget=forms.HiddenInput"
, но виджет здесь не работает: key1_id
- это первичный ключ, а key2_id
- это ForeignKey, работа которого заключается в том, чтобы просто не ловить объекты других людей.изменив в URL-адресе key1_id
.
Получившийся 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>