首页 > 解决方案 > 如何创建一个表单来查询模型中的对象并在新页面中显示查询结果?

问题描述

我正在创建一个爱好网站(Airbnb 克隆),在索引页面上有一个接受城市和属性类型(公寓、办公室、餐厅等)的表单。

我使用 Django 作为我的后端。

托管:https ://directoffices.azurewebsites.net/ (可能需要一些时间来加载**没有 CDN 配置)

这些页面是索引和列表,其中索引是由搜索表单和列出属性的列表组成的登录页面。

我已经建立了一个表单(forms.py):

class SearchPropertyForm(ModelForm):

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields['city'].required = False
    self.fields['city'].empty_label = 'Where do you want to go?'
    self.fields['city'].widget.attrs.update(
        {'class': 'chosen-select-no-single'})

    self.fields['property_type'].required = False
    self.fields['property_type'].empty_label = 'Any Type'
    self.fields['property_type'].widget.attrs.update(
        {'class': 'chosen-select-no-single'})
    

class Meta:
    model = Listing
    fields = ['city', 'property_type']

视图.py

def index(request):
searchForm = SearchPropertyForm()

CONTEXT = {
        'searchForm': searchForm
    }

if request.method == "GET":
    searchForm = SearchPropertyForm(request.GET)
    if searchForm.is_valid():
        location = searchForm.cleaned_data.get('city')
        property_type = searchForm.cleaned_data.get('property_type')
        listings = Listing.objects.filter(
            city=location, property_type=property_type)


        return render(request, 'core/listings.html', {'listings' : listings})
    else:
        searchForm.errors.as_data()
else:
    return render(request, 'core/index.html', CONTEXT)

HTML:

<form class="main-search-form" method="GET" action="/listings/">
    ** CONTENTS AND FIELDS **
</form>

网址.py

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from core import views as coreViews
from users import views as userViews
from properties import views as propertyViews

urlpatterns = [
    path('admin/', admin.site.urls),

    path('', coreViews.index, name="index"),
    path('listing/', coreViews.listing, name='listing'),
    path('contact/', coreViews.contact, name='contact'),
    path('privacy-policy/', coreViews.privacyPolicy, name='privacyPolicy'),
    path('terms-and-conditions/', coreViews.terms, name='terms'),

    path('login/', userViews.loginPage, name='loginPage'),
    path('logout/', userViews.logoutUser, name='logout'),
    path('register/', userViews.registerPage, name='registerPage'),

    path('property/', include('properties.urls', namespace='property')),

    path('submit-property/', propertyViews.submitProperty, name='submit_property'),
    path('sample-property/', propertyViews.sampleProperty, name='sample_property'),

    path('user/<str:user_id>/', include('users.urls', namespace='users')),

] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

我不确定这是否是正确的做法,一旦列表页面启动,索引页面总是重定向到列表页面并且没有办法返回。

请帮我解决一下这个。

标签: pythondjangoformsdjango-modelsdjango-forms

解决方案


你能添加你的网址吗,那里可能有问题。


推荐阅读