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})
classroom.id n'existe pas, vous devez passer que var dans le contexte que je –
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). –
return render (request, 'classroom/adjust.html', {'form': form}} est ici, et dans votre url doit être pk = classroom.id –