Как мне получить доступ к полям формы в шаблоне в Django?

#python #django #django-forms

#python #django #django-forms

Вопрос:

Я использую форму на основе модели для создания формы на основе модели данных. Часть вставки работает нормально, но сейчас я пытаюсь создать страницу «редактировать». моя проблема в том, что мне нужен идентификатор / первичный ключ исходной модели для действия post, и документация (и предыдущий поток здесь), похоже, посоветовали мне попробовать оба form.id и form.instance.id но, похоже, ни то, ни другое не работает. Приветствуются любые идеи или помощь!

Вот мой шаблон:

 <form action="/athlete/edit/{{ form.mod_athlete.id }}" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
  

Вот часть моего представления:

 def changeathlete(request, athlete_id):
        if request.method == 'POST': # If the form has been submitted...
                form = AthleteForm(request.POST) # A form bound to the POST data
                if form.is_valid(): # All validation rules pass
                        form.save()
                        return HttpResponse("Athlete changed!") # Redirect after POST
        else:
                mod_athlete = Athlete.objects.get(pk=athlete_id)
                form = AthleteForm(instance=mod_athlete) # An unbound form

        return render_to_response('edit.html', {
                'form': form,
        }, context_instance=RequestContext(request))
  

Приветствуется любая помощь, и если вам нужна дополнительная информация, я буду рад ее предоставить. Я, конечно, новичок в Django и реальном программировании, поэтому я просто отталкиваюсь от руководства и этого, чтобы изучить. Спасибо!

Обновить

соответствующие части urls.py:

 url(r'^$', 'rosters.views.index', name='index'),
url(r'^admin/', include(admin.site.urls)),
url(r'^athlete/add/', 'rosters.views.createathlete'),
url(r'^athlete/edit/(?P<athlete_id>d )/', 'rosters.views.changeathlete'),
url(r'^meet/(?P<meet_slug>w )/', 'rosters.views.meetindex'),
url(r'^meet/(?P<meet_slug>w )/(?P<occurence_name>w )/', 'rosters.views.occurenceindex'),
url(r'^meet/(?P<meet_slug>w )/(?P<occurence_name>w )/events/', 'rosters.views.meetevents'),
url(r'^meet/(?P<meet_slug>w )/(?P<occurence_name>w )/events/(?P<event_id>w )/', 'rosters.views.addathletes'),
  

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

1. Из вашего кода вы отправляете сообщение по URL /athlete/edit/{{ form.mod_athlete.id }} , но то, что вам действительно нужно, находится athlete_id на странице редактирования. Что делает ваш urls.py как выглядит?

2. Попробуйте прочитать это: docs.djangoproject.com/en/dev/topics/forms/modelforms/… . Чтобы получить недавно сохраненный экземпляр.

3. Однако, прочитав документы, у меня создалось впечатление, что таким образом можно получить любое поле. Или это работает по-разному при использовании экземпляров формы и при использовании modelform? Кроме того, в одном из документов формы они используют «{{form.id }}» Я думаю, для приложения Poll.

Ответ №1:

Athlete Экземпляр будет сохранен на ModelForm , так что вы можете сделать:

 {{ form.instance.id }}
  

Кроме того, вы хотите передать свой Athlete экземпляр в POST случае, если вы на самом деле обновите экземпляр (а не создадите новый).

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

1. Это также сработало после исправления местоположения экземпляра и того, что я отправил через POST, что вы также рекомендовали. Я использовал instance для обозначения моего фактического имени экземпляра, и я не уверен, почему я не попробовал это буквально. И вам спасибо!

Ответ №2:

Если вы остаетесь на той же странице во время процесса редактирования (например http://localhost:8000/athlete/edit/1234/ ), вам не нужно ничего указывать в атрибуте action в вашей форме, следующее должно работать нормально:

 <form action="" method="post">{% csrf_token %}
  {{ form.as_p }}
  <input type="submit" value="Submit" />
</form>
  

Ваша форма также должна передаваться в объект instance в случае POST:

 def changeathlete(request, athlete_id):
    mod_athlete = Athlete.objects.get(pk=athlete_id)
    if request.method == 'POST': # If the form has been submitted...
        form = AthleteForm(request.POST, instance=mod_athlete) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            form.save()
            return HttpResponse("Athlete changed!") # Redirect after POST
    else:
        form = AthleteForm(instance=mod_athlete) # An unbound form

    return render_to_response('edit.html', {
            'form': form,
    }, context_instance=RequestContext(request))
  

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

1. Я попробую это… на данный момент это в любом случае решит проблему. Спасибо!!

2. Я допустил две ошибки. Еще раз спасибо!

Ответ №3:

Я проверил это по некоторому имеющемуся у меня коду для редактирования формы, ваше представление, похоже, в порядке. Как спросил geekam, что вы urls.py нравится? Это должно быть что-то вроде

 (r'^athlete/edit/(?P<athlete_id>d )/$', changeathlete),
  

редактировать: регулярное выражение, которое я опубликовал в записи URL, предполагает числовой идентификатор — я не знаю, какие у вас идентификаторы

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

1. @Steve: Не публикуйте подобную важную информацию в комментарии к ответу. Пожалуйста, обновите вопрос этой информацией. Затем удалите этот комментарий.