django2:基于pk的网址无法正常运行

时间:2018-07-08 14:14:08

标签: python django python-3.x django-forms django-2.0

我想要一个模型ImpCalendar的表单(网页),以便我可以编辑它的数据。 网址应具有我在urls.py中设置的calendar_id(主键)

模型(ImpCalendar)具有场所的外键。我不在视图/表单中使用该外键,所以我不知道它是否相关。

如果我在views.py中这样做;

return render(request, 'importer/calendaredit.html', {'form': calendar})

我确实可以在页面上看到数据,但是看不到(编辑)表单。只是数据,而不是填写字段。

当我这样做

return render(request, 'importer/calendaredit.html', {'form': form})

对我来说听起来很合逻辑,但我得到了错误

django.urls.exceptions.NoReverseMatch: Reverse for 'calendaredit' with arguments '('',)' not found. 1 pattern(s) tried: ['importer\\/calendar\\/(?P<calendar_id>[0-9]+)\\/$']

在我看来,为calendar_id返回的值现在是Forms-data(html),它无法执行任何操作。但是我不知道我在做什么错。它必须处理html代码和传输到它的值,但是我是最后一个。

models.py

class Impcalendar(models.Model):
    establishment = models.ForeignKey(Establishments, on_delete=SET_NULL, null=True)
    url = models.CharField(max_length=255)
    comment = models.CharField(max_length=255, null=True, blank=True)
    status = models.IntegerField(null=True, blank=True)
    def __str__(self):
        return str(self.establishment)

forms.py

from django import forms
import datetime
from importer.models import Impcalendar, Establishments

class ImpcalendarForm(forms.ModelForm):
        class Meta:
            model = Impcalendar
            fields = ['id', 'url']

urls.py

from django.urls import path
from importer import views

urlpatterns = [
    path('', views.index, name='index'),
    path('calendar/<int:calendar_id>/', views.calendaredit,    name='calendaredit')
]

views.py

def calendaredit(request, calendar_id):
    calendar = get_object_or_404(Impcalendar, pk=calendar_id)

    print (calendar.url)
    if request.method == 'POST':
        form = ImpcalendarForm(request.POST, instance=calendar)
        if form.is_valid():
            calendar.save()
    else:
        form = ImpcalendarForm(request.POST or None,  instance=calendar)
    return render(request, 'importer/calendaredit.html', {'form': form})

calendaredit.html

{% extends 'importer/base.html' %}
{% block content %}
<h1>{{ form.id }}</h1>

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

<form action="{% url 'calendaredit' form.id %}" method="post">
   <div class="fieldWrapper">
      {% csrf_token %}
      {{ form.id }}
      {{ form.url }}
   </div>
<input type="submit" value="Save" />
</form>

{% endblock %}

1 个答案:

答案 0 :(得分:0)

您需要同时传递 和它们的名称,并引用日历而不是表单。

return render(request, 'importer/calendaredit.html', {'form': form, 'calendar': calendar})

...

<form action="{% url 'calendaredit' calendar.id %}" method="post">