繁体   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