2017-09-05 2 views
0

Je rencontre toujours des problèmes lors de la transmission de l'ID d'un objet dans l'URL d'un formulaire.Django Comment passer un identifiant d'objet via une action de formulaire?

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'), 
] 

Donc l'idée est que adjust.html me donne un formulaire avec un menu déroulant à un choix correspondant à course_block. Je choisis le cours, cliquez sur soumettre, et j'espère que je suis redirigé vers classroom_form.html. L'action de la forme est d'envoyer l'objet pk à DeleteView qui je pense est censé supprimer l'objet.

En cours d'exécution comme ci-dessus, j'obtiens une erreur: Reverse for 'deleteblock' with arguments '('',)' not found. 1 pattern(s) tried: ['classroom/(?P<pk>[09-]+)/deleteblock/$']. Comment passer correctement l'URL de l'action pour qu'elle corresponde à deleteblock?

Je suppose que je vais le savoir bientôt, mais ai-je besoin d'un get_url_success() dans mon BlockDeleteView?

EDIT: J'ai également essayé de passer une requête au modèle dans le contexte mais j'ai la même erreur. 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 n'existe pas, vous devez passer que var dans le contexte que je –

+0

mon code édité et je pense que je J'ai passé le queryset au template dans le contexte, mais j'ai la même erreur. Je ne suis pas clair sur la façon dont le contexte est passé. Le retour return (request, 'classroom/classroom_form.html', contexte) 'est retourné après la validation du formulaire, ce qui ne semble pas correct (mais c'est juste mon intuition). –

+0

return render (request, 'classroom/adjust.html', {'form': form}} est ici, et dans votre url doit être pk = classroom.id –

Répondre

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

[0-9]+ pas [09-]+, et vous avez besoin d'un success_url ou une méthode get_url_success() dans BlockDeleteView

changer votre 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

J'ai corrigé la faute de frappe, mais je reçois toujours la même erreur. –

+0

alors, quelle est la nouvelle erreur dire? Exactement la même chose avec avant? – Ykh

+0

Oui, j'ai la même erreur. –

0

classroom.id n'existe pas, vous devez passer que var dans le contexte et dans l'URL, vous devez être spécifique devrait être {% url 'classroom:deleteblock' pk=classroom.id %}

+0

Cela donne une erreur similaire: 'Reverse pour 'deleteblock' avec des arguments de mots clés '{ 'pk'. ''} » not found 1 motif (s) a essayé: [ 'classe// deleteblock/$ (P [0-9] +?)']' –

+0

vous devez passer la salle de classe d'objet pas pk –

+0

J'ai essayé toutes les permutations je peux penser: {% url 'classe: deleteblock' % pk}, {.... pk = classroom.id%}, {.... classroom.id%}, { ..... 'pk' = classroom.id%}, {... pk = 'classroom.id'%}. Je dois être quelque chose d'autre incorrectement. –

1

Je pense qu'il devrait être 0-9 et non 09-, utilisé au regex (expression régulière) partie de l'url_mapping pour le deleteblock sur url_patterns.

Essayez ceci:

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

Au lieu de cela:

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

J'ai corrigé la faute de frappe, mais je reçois toujours la même erreur. –