Как передать аргумент из url в form django?
Есть страница объявления, к которому нужно оставить комментарий. (адрес объявления содержит его id: http://localhost:8000/bboard/bb/10)
Добавление комментария происходит через форму, но она требует указания объявления.
Мне нужно, чтобы при добавлении комментария к конкретному объявлению, его id из url автоматически передавалось в форму и не требовало указания объявления в ручную.
ps: код содержит безуспешные попытки сделать это по советам в интернете
Код:
views.py
def new_comment(request, bboard_id):
form = forms.CommentForm(initial={'bboard_id': bboard_id})
context = {'form': form}
return render(request, 'bboard/add_com.html', context)
models.py
class Bb(models.Model):
title = models.CharField(max_length=50, verbose_name='Товар')
content = models.TextField(null=True, blank=True, verbose_name='Описание')
price = models.FloatField(null=True, blank=True, verbose_name='Цена')
pub_date = models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Опубликовано')
class Comment(models.Model):
author = models.CharField(max_length=30, verbose_name='Автор')
content = models.TextField(verbose_name='Текст комментария')
pub_date = models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Опубликован')
bb = models.ForeignKey(Bb, on_delete=models.CASCADE, verbose_name='Объявление')
forms.py
class CommentForm(ModelForm):
class Meta:
model = models.Comment
fields = ('author', 'content', 'bb')
def __init_(self, bboard_id):
super(CommentForm, self).__init__(self, bboard_id)
self.fields['bb'] = models.Bb.objects.get(pk=bboard_id)
блок формы html
{% block content %}
<h2>Добавление комментария</h>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value='Добавить'></input>
</form>
{% endblock %}
Ответы (1 шт):
Автор решения: driver
→ Ссылка
Нашел решение. Реализовал контроллер-функцию вместо класса. А именно, вместо класса
class CommentForm(ModelForm):
class Meta:
model = models.Comment
fields = ('author', 'content', 'bb')
def __init_(self, bboard_id):
super(CommentForm, self).__init__(self, bboard_id)
self.fields['bb'] = models.Bb.objects.get(pk=bboard_id)
Функция:
def new_comment(request, bboard_id):
if request.method == 'POST':
form = forms.CommentForm(request.POST, initial={'bb': Bb.objects.get(pk=bboard_id)})
if form.is_valid():
form.save(commit=False)
form.bb = bboard_id
form.save()
return HttpResponseRedirect('http://localhost:8000/bboard/')
else:
context = {'form': form}
return render(request, 'bboard/add_com.html', context)
else:
form = forms.CommentForm(initial={'bb': Bb.objects.get(pk=bboard_id)})
context = {'form': form}
return render(request, 'bboard/add_com.html', context)
И сделал поле bb в forms.py скрытым:
class CommentForm(ModelForm):
class Meta:
model = models.Comment
fields = ('author', 'content', 'bb')
widgets = {'bb': HiddenInput()}