[英]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.