Как получить объект с формой, а затем отправить его на следующий вид, используя URL-адреса? - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь отправить объект, полученный с помощью ModelChoiceField , в представление через URL-адреса и параметры просмотра. Я не думаю, что это правильный метод.Я не знаю, должен ли я использовать метод POST или GET .

Когда я использую метод GET , объект отображаетсяв URL, но вид остается прежним.С помощью метода POST django отправляет сообщения об ошибках о параметрах.

РЕДАКТИРОВАТЬ: Я не помню точные сообщения, я не могу восстановить их сейчас, но, как я помню, они что-то сказаликак Reverse for argument not found

Моя форма

class IndividuForm(forms.Form):
    individu = forms.ModelChoiceField(queryset=Individu.objects.all()

Вот представление с формой

def index(request):
    individu_form = IndividuForm(request.GET or None)
    if individu_form.is_valid():
        individu_id = individu_form.cleaned_data['individu'].id
        HttpResponseRedirect('%i/raison/' % individu_id)
    return render(request, 'derog_bv/index.html', {'individu_form':individu_form})

Шаблон, где отображается форма

<form action="{% url 'index' <!-- Errors when I put parameters here --> %} method="<!-- GET or POST -->">
    {% csrf_token %}
    {{ form }}
<input type="submit">Suivant</input>
</form>

Вид, где я хочу получить свой объект

def raison(request, """ error with this parameter : individu_id"""):
    individu = get_object_or_404(Individu, pk=individu_id)

URLs

urlpatterns = [
    path('', views.index, name='index'),
    path('<int:individu_id>/raison/', views.raison, name='raison'),
]

1 Ответ

0 голосов
/ 25 июня 2019

Хорошо, так:

1 / вы определенно хотите использовать метод GET для вашей формы (вы не отправляете данные для обработки / изменения состояния сервера)

2 / Я не знаюНе знаете, почему вы хотите передать параметры (и какие параметры FWIW) тегу {% url %} в шаблоне индекса - вы отправляете форму в представление индекса, которое не ожидает каких-либо дополнительных параметров.На самом деле вы можете просто удалить атрибут action тега HTML-формы, поскольку по умолчанию (отправка на текущий URL-адрес) - то, что вам нужно.

3 / ваш views.raison прототип должен соответствовать определению URL-адреса, поэтомуэто должно быть:

def raison(request, individu_id):
    # code here

4 / в вашем индексном представлении:

HttpResponseRedirect('%i/raison/' % individu_id)

вы хотите построить URL, используя вместо него django.core.urlresolvers.reverse:

from django.core.urlresolvers import reverse


def index(request):
   # code here
   if ...:
       next = reverse("raison", kwargs={"individu_id": individu_id}) 
       return HttpResponseRedirect(next)

или - еще проще - просто используйте ярлык redirect :

from django.shortcuts import redirect


def index(request):
   # code here
   if ...:
       return redirect("raison", individu_id=individu_id) 

Могут быть другие проблемы с вашим кодом, но из информации, которую вы разместили, эти подсказки должны как минимум содержатьты вернулся на рельсы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...