#python #django #django-forms
Вопрос:
Я пытаюсь создать страницу редактирования записи в Django, но когда я ее тестирую, форма не отображается, только кнопка «Отправить». На странице нет полей ввода, отображаемых на странице.
При запуске сервера или загрузке страницы ошибок не возникает.
Вот мой код:
Вид:
@login_required
def updateview(request, pk):
if request.method == "POST":
instance = get_object_or_404(Listing, tag=pk)
updateform = ListingUpdateForm(request.POST, instance=instance)
if updateform.is_valid():
updateform.save()
listing = updateform.instance
messages.success(request, "New Listing Created")
return redirect(reverse('main:listingdetails', kwargs={'pk': listing.tag}))
else:
messages.error(request, 'Please correct the error below.')
updateform = ListingUpdateForm
return render(request,
"main/createlisting.html",
context={"updateform":updateform})
Шаблон:
{% block content %}
<form enctype="multipart/form-data" method="post">
{% csrf_token %}
{{updateform}}
<button type="submit">post</button>
</form>
{% endblock %}
Форма:
class ListingUpdateForm(forms.ModelForm):
countryList = (("US", "United States"),
("UK", "United Kingdom"))
country = forms.ChoiceField(choices=countryList)
class Meta:
model = Listing
fields = ('title', 'description', 'price', 'country')
URL-адреса:
urlpatterns = [
path("", ListingListView.as_view(), name="homepage"),
path("register/", views.register, name="register"),
path("logout/", views.logout_request, name="logout"),
path("login/", views.login_request, name="login"),
path("updateprofile/", views.updateprofile, name="updateprofile"),
path("listing/<uuid:pk>/", ListingDetailView.as_view(), name='listingdetails'),
path("listing/create/", views.createview, name='listingcreate'),
path("listing/<uuid:pk>/update/", views.updateview, name='postupdate'),
path("profile/<username>/", views.profile, name='profile'),
]
Спасибо за любую помощь.
Комментарии:
1. Это «корень»
urls.py
или есть другиеurls.py
? Похоже, что шаблоны URL-адресов другого приложения проверяются передpostupdate
.2. Да, я использовал include() в «корне», чтобы ссылаться на это, которое находится в папке «main». Я не думаю, что в этом проблема, так как все мои другие URL-адреса работают нормально.
3. Мне кажется, что
createview
это тот, который не срабатывает, а не тотupdateview
. Вы должны поставитьcreateview
(listingcreate
) передlistingdetails
.4. Вы имеете в виду переместить строку «создание списка» перед строкой «сведения о списке»? Если это так, я сделал это, и форма все еще не отображается.
5. с каким URL-адресом вы работаете?
Ответ №1:
В случае запроса GET вам следует создать объект формы. Кроме того, вы должны перенаправлять только в случае успешного запроса на публикацию и повторно отправлять форму в случае, если она недействительна, таким образом, Django может отображать ошибки рядом с элементами формы:
@login_required
def updateview(request, pk):
instance = get_object_or_404(Listing, tag=pk)
if request.method == "POST":
updateform = ListingUpdateForm(request.POST, instance=instance)
if updateform.is_valid():
listing = updateform.save()
return redirect('main:listingdetails', pk=listing.pk)
else:
updateform = ListingUpdateForm(instance=instance)
return render(
request,
'main/createlisting.html',
context={'updateform': updateform}
)
Комментарии:
1. Спасибо, но это не сработало, форма не отображается, и по-прежнему нет ошибки. Есть еще какие-нибудь предложения?
2. @SirBlender: вы уверены, что запускаете правильное представление? Что делать, если вы добавите
print(..)
утверждение вверху (доinstance = ...
), оно что-то напечатает, иначе возникнет проблема с шаблонами URL-адресов.3. Ничего не печатается, так что, должно быть, проблема с URL-адресами, как вы сказали, но я не вижу, в чем дело. Я добавил свои шаблоны URL-адресов в исходное сообщение, просмотр обновлений занимает второе место снизу.