簡體   English   中英

Django如何正確提交表單並處理請求?

[英]Django how to properly submit form and handle request?

我是Django / Python的新手,並且正在使用一個Webapp,該Webapp根據主頁上的選擇/下拉列表查詢汽車數據庫,並將用戶發送到有關他們選擇的汽車的詳細信息頁面。 這是通過“ make”,“ model”和“ trim”下拉框完成的。 我在理解和執行錯誤時遇到的麻煩是,在單擊提交表單的按鈕后提交了整理ID。 我知道需要發生什么,我只是不知道如何使用Django視圖和模板來完成。

通過從IndexView返回的queryset填充make框。 通過jQuery / Ajax填充模型框,具體取決於在make框中選擇了哪個make。 裝飾框的使用方法與之相同,取決​​於在模型框中選擇的內容。 現在,我需要能夠提交表單(由於裝飾是指定的汽車,因此實際上只需要提交裝飾ID),以顯示有關用戶選擇的汽車的詳細信息。

這是我得到的錯誤:

Reverse for 'search' with arguments '('',)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['search/(?P<trim>\\d+)/$']

這基本上是我的主頁模板的樣子:

  <form action="{% url 'search:search' trim.id %}" class="form-inline" id="dropdownText"> <div class="form-group" id="dropdownGroup"> <span style="display:inline-block" class="selectBox"> <select class="form-control" id="make"> <option value='empty'></option> {% for make in allMakes %} <option value="{{ make.id }}">{{ make.name }}</option> {% endfor %} </select> <label for="make" style="display:block">Make</label> </span> <span style="display:inline-block" class="selectBox"> <select class="form-control" id="model" disabled> <!-- List each make's model's name with JQ. --> </select> <label for="model" style="display:block">Model</label> </span> <span style="display:inline-block" class="selectBox"> <select class="form-control" id="trim" name="selectedTrim" disabled> <!-- List all trims for each make/model with JQ. --> </select> <label for="trim" style="display:block">Trim</label> </span> </div> <div class="text-center"> <button type="submit" class="btn btn-default" id="go">GO!</button> </div> </form> 

網址:

# Index
url(r'^$', views.IndexView.as_view(), name='index'),

# /trimId
url(r'^(?P<pk>\d+)/$',
DetailView.as_view(), name='detail'),

# /search
url(r'^search/(?P<trim>\d+)/$', views.search, name='search'),

# Uses Ajax/JSON to change the model/trim boxes. Use make
# and model instead of pk to pass them into the view fxns.
url(r'^getmodels/(?P<make>\d+)/', views.getModels, name='getmodels'),
url(r'^gettrims/(?P<model>\d+)/', views.getTrims, name='gettrims'),

觀看次數:

class IndexView(generic.ListView):
    template_name = 'search/index.html'

    # Name of the template varible.
    context_object_name = 'allMakes'

        def get_queryset(self):
            # Return what will be listed in index.html
            return Make.objects.all()

class DetailView(generic.DetailView):
    model = Trim
    template_name = 'search/detail.html'

# Take in the request and the ID for the selected Make
# and return something that we can work with in JS!
def getModels(request, make):
    selectedMake = Make.objects.get(id=make)

    # Get the models based on what was selected as the make.
    models = Model.objects.all().filter(make=selectedMake)
    # Translate to JSON
    jsonModels = serializers.serialize("json", models)
    # Return the JSON.
    return HttpResponse(jsonModels, content_type='application/javascript')

def getTrims(request, model):
    selectedModel = Model.objects.get(id=model)

    trims = Trim.objects.all().filter(model=selectedModel)
    jsonTrims = serializers.serialize("json", trims)
    return HttpResponse(jsonTrims, content_type='application/javascript')

# Can I make this redirect to the DetailView with the ID for the
# trim to show details for?
def search(request, trim):
    selectedTrim = get_object_or_404(Trim, pk=trim)
    context = {'trim': selectedTrim}
    return render(request, 'search/detail.html', context)

該錯誤:

Reverse for 'search' with arguments '('',)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['search/(?P<trim>\\d+)/$']

表示您沒有提供id參數(您稱其為trim)。 它應該是參數或關鍵字參數的一部分。

我認為這是因為模板中沒有修剪對象:

<form action="{% url 'search:search' trim.id %}"

該模板是否通過DetailView呈現? 如果是這樣的話,以下方法可能會起作用:

<form action="{% url 'search:search' object.id %}"

解決這個問題的方法是我使用了網址格式。 通過取出搜索 URL的ID部分,並按如下方式更改視圖:

def search(request):

    trim = request.GET['selectedTrim']
    selectedTrim = get_object_or_404(Trim, id=trim)
    context = {'trim': selectedTrim}
    return render(request, 'search/detail.html', context)

而我的表單動作是:

action="{% url 'search:search' %}"

我能夠通過請求方法,而不是通過url regex變量,成功地將選定的修剪傳遞給視圖,這是由於通過提供給模板的上下文實際不存在所選修剪ID導致的錯誤(我認為)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM