2017-09-05 136 views
0

我仍然有一個問題傳遞一個窗體的URL中的對象的ID。Django如何通過表單動作傳遞對象ID?

adjust.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()嗎?

編輯:我也試過將查詢傳遞到上下文中的模板,但有相同的錯誤。 views.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}) 
+0

classroom.id不存在,則必須傳遞VAR的背景下 –

+0

我修改了代碼,我想我已經將查詢集傳遞給上下文中的模板,但是我得到相同的錯誤。我不清楚上下文是如何通過的。在表單驗證之後返回'return render(request,'classroom/classroom_form.html',context)',這看起來不正確(但這只是我的直覺)。 –

+0

return render(request,'classroom/adjust.html',{'form':form})就在這裏,並且在你的url中必須是pk = classroom.id –

回答

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

[0-9]+[09-]+,你需要在BlockDeleteView

一個success_url或get_url_success()方法

改變你的views.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'), 
+0

我已經改正了這個錯字,但我仍然得到同樣的錯誤。 –

+0

那麼,新的錯誤說的是什麼?與之前的完全一樣? – Ykh

+0

是的,我得到同樣的錯誤。 –

0

classroom.id不存在,則必須傳遞VAR的背景下,並在URL你必須要具體應該{% url 'classroom:deleteblock' pk=classroom.id %}

+0

這給出了一個類似的錯誤:'''帶有關鍵字參數的'deleteblock''{ 'pk':''}'not found。1 pattern(s)tried:['classroom /(?P [0-9] +)/ deleteblock/$']' –

+0

您必須通過對象教室而不是pk –

+0

我試過了我能想到的所有變化:{%url'教室:deleteblock'pk%},{.... pk = classroom.id%},{.... classroom.id%},{ .....'pk'= classroom.id%},{... pk ='classroom.id'%}。我必須別的東西不正確。 –

1

我覺得應該是0-9,而不是09-,在使用正則表達式(正則表達式)url_patterns的deleteblock的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') 
+0

我修正了錯字,但仍然收到相同的錯誤。 –