Django: добавление формы из одного приложения в шаблон другого приложения (подробный просмотр)

#django #django-forms

#django #django-формы

Вопрос:

Я хочу добавить форму для пользователя, чтобы добавить оценку и комментарий к обзору, который обновляет модель из другого приложения (приложение для оценки и элементов). Я некоторое время боролся с этим. Прямо сейчас у меня есть:

Рейтинги MODELS.py

 class Avaliacao(models.Model):
    RATING_CHOICES = (
        (1, '1'),
        (2, '2'),
        (3, '3'),
        (4, '4'),
        (5, '5'),
    )
    created_at = models.DateTimeField(auto_now=True)
    usuario = models.ForeignKey(get_user_model(),on_delete=models.CASCADE)
    safra = models.ForeignKey(Safra,blank=False,on_delete=models.SET_NULL,null=True)
    nota = models.IntegerField(choices=RATING_CHOICES)
    comment = models.TextField()
  

forms.py

 class NotaFormulario(ModelForm):
    class Meta:
        model = Avaliacao
        fields = ['nota','comment']
  

urls.py

 urlpatterns = [
    url(r'^safra/(?P<safra_id>[0-9] )/add_review/$',views.add_review, name='add_review')
]
  

views.py

 def add_review(request, safra_id):
    safra = get_object_or_404(Safra, pk=safra_id)
    form = NotaFormulario(request.POST)

    if form.is_valid():
        nota = form.cleaned_data['nota']
        comment = form.cleaned_data['comment']
        usuario = request.user
        avaliacao = Avaliacao()
        avaliacao.safra = safra
        avaliacao.usuario = usuario
        avaliacao.nota = nota
        avaliacao.comment = comment
        avaliacao.created_at = datetime.datetime.now()
        avaliacao.save()

        # Always return an HttpResponseRedirect after successfully dealing
        # with POST data. This prevents data from being posted twice if a
        # user hits the Back button.
        return HttpResponseRedirect(reverse('vinhos:safra_detalhes', args=(safra.id,)))


    return render(request, 'vinhos/safra_detail.html', {'safra': safra, 'formulario': form})
  

template.html (это мой подробный шаблон из другого приложения)

 <form action="{% url 'notas:add_review' safra.id %}" method="post" >
  {% csrf_token %}
  {{ formulario }}
  <input type="submit" value="Enviar" class="btn btn-primary btn-large">


</form>
  

urls.py Путь к шаблону (страница просмотра деталей из другого приложения), где расположена форма, является

 path('safra/<int:pk>/',views.SafraDetalhes.as_view(), name='safra_detalhes'),
  

Поля не отображаются. HTML-код выглядит следующим образом:

 <form action="/safra/6/add_review/" method="post" >
  <input type="hidden" name="csrfmiddlewaretoken" value="ofbt2lvghvsNhPuSVRDtAgP3gYoGI55AIoXcA8EpUE29Sp">

  <input type="submit" value="Enviar" class="btn btn-primary btn-large">


</form>
  

Форма отображается только после того, как я нажму отправить один раз, затем она отображается с предупреждением «Это поле обязательно».

В целом, я испытывал трудности с формами в Django, потому что в приложениях, которые я пытаюсь разработать, всегда есть этот срез формы, создающий экземпляр модели из одного приложения в детальном представлении из другой модели из другого приложения.

Комментарии:

1. Просто попробуйте также передать форму в методе GET и проверьте, видна ли она.

2. Это не сработало. Я думаю, что речь идет о добавлении контекста в просмотр деталей, но я застрял с новым набором ошибок при попытке использовать get_context_data в представлении деталей.