【问题标题】:Django How to pass object id via form action?Django 如何通过表单操作传递对象 ID?
【发布时间】: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&lt;pk&gt;[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


【解决方案1】:
url(r'^(?P<pk>[0-9]+)/deleteblock/$', delete_block_view, name='deleteblock'),

[0-9]+ 不是[09-]+,并且你需要 BlockDeleteView 中的 success_url 或 get_url_success() 方法

改变你的观点.py:

class BlockDeleteView(DeleteView):
    model = Classroom
    slug_field = 'id'
    success_url = reverse_lazy('some_url')
    template_name = 'classroom/delete.html'

urls.py

url(r'^(?P<pk>[0-9]+)/deleteblock/$', BlockDeleteView.as_view(), name='deleteblock'),

【讨论】:

  • 我已更正了错字,但仍然遇到同样的错误。
  • 那么,新的错误是什么意思?和之前的一模一样?
  • 错误是Reverse for 'deleteblock' with arguments '('',)' not found. 1 pattern(s) tried: ['classroom/(?P&lt;pk&gt;[0-9]+)/deleteblock/$']。看了docs on url tag,我觉得urls.py这一行应该是url(r'^deleteblock/(?P&lt;pk&gt;[0-9]+)/$', delete_block_view, name='deleteblock')。无论哪种方式,无论我尝试了什么,我都会遇到基本相同的错误。
  • 可能是您没有发布的内容导致错误,您是否更改了我在views.py中写的内容,例如:class BlockDeleteView(DeleteView): model = Classroom slug_field = 'id' success_url = reverse_lazy('some_url') template_name = 'classroom/delete.html'
  • 你确定错误是由这一行引起的:&lt;form action="{% url 'classroom:deleteblock' classroom.id %}" method="post"&gt;?
【解决方案2】:

我认为它应该是 0-9 而不是 09- ,在 url_patterns 的删除块的 url_mapping 的正则表达式(正则表达式)部分使用。

试试这个:

url(r'^(?P<pk>[0-9]+)/deleteblock/$', delete_block_view, name='deleteblock')

而不是这个:

url(r'^(?P<pk>[09-]+)/deleteblock/$', delete_block_view, name='deleteblock')

【讨论】:

  • 我已更正了错字,但仍然遇到同样的错误。
【解决方案3】:

classroom.id 不存在,您必须在上下文中传递该变量,并且在您必须具体说明的 url 中应该是 {% url 'classroom:deleteblock' pk=classroom.id %}

【讨论】:

  • 这给出了类似的错误:Reverse for 'deleteblock' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['classroom/(?P&lt;pk&gt;[0-9]+)/deleteblock/$']
  • 你必须通过对象教室而不是pk
  • 我已经尝试了所有我能想到的排列方式:{% url 'classroom:deleteblock' pk %}, {.... pk=classroom.id %}, {....classroom .id %},{.....'pk'=classroom.id %},{...pk='classroom.id'%}。我一定是其他错误的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多