Скрытые данные в форме, но PrimaryKey или ForeignKey

#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 and request.key2_id не работают, потому что они не являются атрибутами request ; это прямые аргументы, которые были переданы вашему представлению, поэтому вы ссылаетесь на них просто как key1_id на and key2_id .

Ответ №1:

Это не request.key2_id запрос It request.POST['key2_id ]`.POST — это QueryDict, который действует как словарь, поэтому печатает запрос.POST покажет вам словарь.

При этом вы все равно можете использовать / определять эти файлы как HiddenInput, а затем использовать проверку формы django, чтобы убедиться, что они имеют правильный тип / существуют и т.д. Существует множество вариантов, когда дело доходит до обработки форм, переменных запроса и проверки.

Комментарии:

1. Хорошо, спасибо за подведение итогов. Решение, которое я выбрал, которое было очень простым, заключалось в том, чтобы встроить данные в URL, как это было предложено Дэниелом Роземаном в комментариях к исходному вопросу. Это не привело бы к необходимости большого количества данных, но для простого указателя на то, к какому объекту обращается текущая форма, это очень просто.

2. Да, это то, что я тоже делаю большую часть времени.