尝试了NoReverseMatch 1模式:['PUTData /(?P <pk> [0-9] +)/ $']

时间:2019-07-29 01:39:48

标签: python django

因此,我正在使用django进行我的第一个项目,该项目显示了REST API方法的示例,例如通过姓,名和电子邮件组成的数据库进行的POST,GET,PUT和DELETE。我已经成功完成了POST和GET,但现在在使用PUT时遇到了麻烦。

所以我有三个功能。首先,一个简单的def函数显示到目前为止的所有信息输入。其次是基于类的函数,该函数以特定顺序列出信息。第三,另一个基于类的函数,显示该特定信息的详细信息。所有功能都可以工作,但是现在当我将两个html文件链接在一起时,我得到了一个错误。想要链接到该特定信息时,我尝试了许多不同的ID,但它们却无法正常工作。

但这是我的models.py:

class Information(models.Model):
    """Placeholder code that the viewer will be seeing."""
    info_id = models.AutoField(primary_key=True,unique=True)
    first_name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)
    e_mail = models.CharField(max_length=200)
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        """Return information."""
        return f"Info ID: {self.info_id}, First Name: {self.first_name}, Last Name: {self.last_name}, E-mail: {self.e_mail}"

这是我的表格。py:

class NameForm(forms.ModelForm):
    class Meta:
        model = Information
        fields = ['info_id', 'first_name', 'last_name', 'e_mail']
        labels = {'first_name': 'First Name:', 'last_name': 'Last Name:', 'e_mail': 'E-mail:'}
        widgets = {'first_name': '',
                   'last_name': '',
                   'e_mail': '',
                   }


        def clean(self):
            cleaned_data = super(NameForm, self).clean()
            labels = cleaned_data.get('labels')
            widgets = cleaned_data.get('widgets')

这是我的urls.py:

# Page(s) that shows the viewer an example of PUT.
    path('PUTData/', InfoDataListView.as_view(), name='put_data'),
    path('PUTData/<int:pk>/', InfoDataDetailView.as_view(), name='put_detail'),

这是我的views.py:

def put_data(request):
    put_data = Information.objects.all()
    context = {'put_data': put_data}
    return render(request, 'just_projects/put_data.html', context)

class InfoDataListView(ListView):
    model = Information
    template_name = 'just_projects/put_data.html'
    context_object_name = 'put_data'
    ordering = ['-date_added']

class InfoDataDetailView(DetailView):
    model = Information 

这是我的两个html:put_data.html和information_detail.html

{% extends "just_projects/base.html" %}
{% block content %}
    <p><h3>Information:</h3></p>

        <ul>
        {% for pd in put_data %}
            <div class="card mb-3">
                <h4 class="card-header">
                    {{ pd.date_added|date:'M d, Y H:i' }}
                    <small><a href="{% url 'just_projects:put_detail' PUTData.id %}">Edit info.</a></small>
                </h4>
                <div class="card-body">
                    {{ pd }}
                </div>
            </div>
        {% empty %}
            <li>There is no information yet.</li>
        {% endfor %}
        </ul>
    <hr />
{% endblock content %}
{% extends "just_projects/base.html" %}

{% block content %}
    <p><h3>Information:</h3></p>
        <ul>
            <div class="card mb-3">
                <h4 class="card-header">
                    {{ object.date_added|date:'M d, Y H:i' }}
                </h4>
                <div class="card-body">
                    {{ object }}
                </div>
            </div>
        </ul>
    <hr />
    <p>
    </p>
{% endblock content %}

因此错误消息是反向匹配,因为他们找不到正确的ID吗?具体的异常错误和值是: 异常类型:NoReverseMatch 异常值:
找不到带有参数“('',)”的“ put_detail”。尝试了1个模式:['PUTData /(?P [0-9] +)/ $']

1 个答案:

答案 0 :(得分:0)

您在url标记中使用了错误的变量名。您的对象称为pd,因此ID就是从那里来的。

<a href="{% url 'just_projects:put_detail' pd.id %}">

(不相关,但是您的clean方法是没有意义的;它在Meta类之内,因此永远不会被调用,但是它没有任何用处。您应该删除它。)

编辑,查看您的模型,由于某种原因,您的主键称为info_id。因此,pd.info_id或只是pd.pk

尽管我会质疑为什么首先需要更改主键的名称。