【发布时间】:2017-09-05 03:08:08
【问题描述】:
在表单的 url 中传递对象的 id 时仍然遇到问题。
调整.html
<form action="{% url 'classroom:deleteblock' classroom.id %}" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="submit" />
</form>
models.py
class Classroom(models.Model):
COURSE_NAME = (
('MA8', 'Math 8'),
('SC10', 'Science 10'),
('PH11', 'Physics 11'),
('PH12', 'Physics 12'),
)
BLOCK_NUMBER = (
('11', 'Block 1-1'),
('12', 'Block 1-2'),
('13', 'Block 1-3'),
('14', 'Block 1-4'),
('21', 'Block 2-1'),
('22', 'Block 2-2'),
('23', 'Block 2-3'),
('24', 'Block 2-4'),
)
class_list = models.TextField()
course_name = models.CharField(max_length=20, choices=COURSE_NAME)
course_block = models.CharField(max_length=10, choices=BLOCK_NUMBER)
group_size = models.IntegerField(default=3)
def __str__(self):
return self.get_course_block_display()
def save(self, *args, **kwargs):
super(Classroom, self).save(*args, **kwargs)
# overrides the default save function to parse the class list
studentList = []
studentList = self.class_list.split('\n')
print (studentList)
for line in studentList:
line = line.strip('\r')
s = Student.objects.create(nickname = line, classroom = self)
class DeleteForm(ModelForm):
class Meta:
model = Classroom
fields = ['course_block']
views.py
class BlockDeleteView(DeleteView):
model = Classroom
delete_block_view = BlockDeleteView.as_view()
def adjust(request):
if request.method == 'POST':
form = DeleteForm(request.POST)
if form.is_valid():
return render(request, 'classroom/adjust.html')
else:
form = DeleteForm()
return render(request, 'classroom/adjust.html', {'form': form})
urls.py
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^submitted', views.submitted, name='submitted'),
url(r'^classup/$', create_classroom_view, name='classroom'),
url(r'^block/$', views.block, name='block'),
url(r'^(?P<pk>[09-]+)/deleteblock/$', delete_block_view, name='deleteblock'),
url(r'^adjust/$', views.adjust, name='adjust'),
url(r'^random/$', list_random_view, name='random'),
]
所以想法是,adjust.html 为我提供了一个表单,其中包含与 course_block 对应的一个选择下拉菜单。我选择了课程,点击提交,希望我被重定向到classroom_form.html。表单的作用是将对象 pk 发送到我认为应该删除对象的 DeleteView。
如上运行,我得到一个错误:Reverse for 'deleteblock' with arguments '('',)' not found. 1 pattern(s) tried: ['classroom/(?P<pk>[09-]+)/deleteblock/$']。如何正确传递操作 url 以匹配 deleteblock?
我想我很快就会知道,但我的BlockDeleteView 中需要get_url_success() 吗?
编辑:我也尝试在上下文中将查询传递给模板,但出现相同的错误。 视图.py
def adjust(request):
classroom = Classroom.objects.all().first()
if request.method == 'POST':
form = DeleteForm(request.POST)
if form.is_valid():
return render(request, 'classroom/adjust.html', {'form':form}, {'classroom':classroom})
else:
form = DeleteForm()
return render(request, 'classroom/adjust.html', {'form': form}, {'classroom': classroom})
【问题讨论】:
-
classroom.id 不存在,您必须在上下文中传递该变量
-
我编辑了我的代码,我认为我已经将查询集传递给上下文中的模板,但我得到了同样的错误。我不清楚上下文是如何传递的。
return render(request, 'classroom/classroom_form.html', context)在表单验证后返回,这似乎不对(但这只是我的直觉)。 -
return render(request, 'classroom/adjust.html', {'form': form}) 在这里,并且在你的url中必须是pk=classroom.id
标签: django django-forms