Форма Django не отображается на веб — странице

#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-адресов в исходное сообщение, просмотр обновлений занимает второе место снизу.