#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: Не публикуйте подобную важную информацию в комментарии к ответу. Пожалуйста, обновите вопрос этой информацией. Затем удалите этот комментарий.