簡體   English   中英

Django“使用參數反轉____”…錯誤

[英]Django “reverse for ____ with arguments”… error

我收到以下錯誤

錯誤: placeinterest帶有參數('',)和關鍵字參數{} placeinterest 嘗試了1種模式:

[u'polls/(?P<section_id>[0-9]+)/placeinterest/$']

我通過一個輪詢應用程序的Django示例進行了研究,現在我正嘗試創建一個適應現有功能的類注冊應用程序。 錯誤指向第5行:

<h1>{{ section.class_name }}</h1>

{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

<form action="{% url 'polls:placeinterest' section.id %}" method="post">
{% csrf_token %}
<input type="radio" name="incr" id="incr" value="incr" />
<label for="incr"></label><br />
<input type="submit" value="Placeinterest" />
</form>

但我認為問題出在我的placeinterest函數中:

def placeinterest(request, section_id):
    section = get_object_or_404(Section, pk=section_id)
    try:
        selected_choice = section.num_interested
    except (KeyError, Section.num_interested.DoesNotExist):
        # Redisplay the question voting form.
        return render(request, 'polls/detail.html', {
            'section': section,
            'error_message': "You didn't select a choice.",
        })
    else:
        section.num_interested += 1
        section.save()
        # Always return an HttpResponseRedirect after successfully dealing
        # with POST data. This prevents data from being posted twice if a
        # user hits the Back button.
        return HttpResponseRedirect(reverse('polls:results', args=(section.id,)))

如果我的Section類看起來像這樣,我不確定應該是什么POST調用:

class Section(models.Model):
    class_name = models.CharField(max_length=200)
    num_interested = models.IntegerField(default=0)
    pub_date = models.DateTimeField('date published')
    def __str__(self):
        return self.class_name
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(minutes=3)
    def some_interested(self):
        if self.num_interested > 0:
            return "There is currently interest in this class"
        else:
            return "There is currently no interest in this class"

結果部分在我的瀏覽器中正常顯示,下面是urls.py,可以很好地衡量:

from django.conf.urls import url

from . import views

app_name = 'polls'
urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
    url(r'^(?P<pk>[0-9]+)/results/$', views.ResultsView.as_view(), name='results'),
    url(r'^(?P<section_id>[0-9]+)/placeinterest/$', views.placeinterest, name='placeinterest'),
]

編輯:從示例中添加原始代碼,希望可以幫助某人查看我出了什么問題:

網址:

from django.conf.urls import url

from . import views

app_name = 'polls'
urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
    url(r'^(?P<pk>[0-9]+)/results/$', views.ResultsView.as_view(), name='results'),
    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]

views.py中的表決功能:

def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        # Redisplay the question voting form.
        return render(request, 'polls/detail.html', {
            'question': question,
            'error_message': "You didn't select a choice.",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        # Always return an HttpResponseRedirect after successfully dealing
        # with POST data. This prevents data from being posted twice if a
        # user hits the Back button.
        return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))

detail.html,進行更改后出現問題:

<h1>{{ question.question_text }}</h1>

{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
    <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
{% endfor %}
<input type="submit" value="Vote" />
</form>

該錯誤與您的視圖無關。 它專門表示正在嘗試匹配錯誤中名為placeinterest的URL。 它知道URL存在,但是參數錯誤。

它認為您正在嘗試傳遞一個空字符串作為位置參數。 這意味着呈現模板時, section.id可能為None 它將空值轉換為空字符串,並將其作為位置參數傳遞,因此傳遞為('',) 那是一個有一個空字符串值的元組。

問題在這里:

<form action="{% url 'polls:placeinterest' section.id %}" method="post">

Django無法弄清楚url參數的配置錯誤。 用這個:

<form action="{% url 'polls:placeinterest' section_id=section.id %}" method="post">

您還需要確保部分ID是有效的數字(請注意您提供的"section"作為上下文)。

暫無
暫無

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

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