Django CreateView форма не вставляется - PullRequest
0 голосов
/ 15 ноября 2018

Я довольно новичок в этом, но я пытаюсь сделать так, чтобы моя форма отображалась (вводилась как часть шаблона) в другом представлении.В инструментах разработчика я вижу HTML для моей включенной страницы (polls / _poll_form.html), но не форму.Буду признателен, если кто-нибудь укажет мне правильное направление.

models.py

class Poll(models.Model):
    poll_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255, unique=True)
    topic = models.ForeignKey(
        Topic,
        related_name = 'polls',
        on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    last_updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super().save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse(
            'polls:single',
            kwargs={'pk':self.pk}
        )

    class Meta:
        db_table = 'polls'
        ordering = ['last_updated_at']

views.py

  class CreatePoll(LoginRequiredMixin, generic.CreateView):
        template_name = 'polls/_poll_form.html'
        model = Poll

_poll_form.html (внедренный шаблон)

<div class="container poll-form-header">
    <p class="text-center">Get Started</p>
</div>
<form class="create-poll-form" action="{% url 'topics:single' pk=topic.topic_id %}" method="POST">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit" class="btn btn-dark float-right">
</form>

topic_detail.html

{% extends "topics/topic_base.html" %}

{%block topics_content %}
  <div class="col-md-12 list-group polls-list">
      <div class="container new-poll-button">
        <a class = "btn btn-dark float-right mt-2" data-toggle="collapse" href="#poll-form" role="button" aria-expanded="false">Create Poll</a>
      </div>
      <div class="collapse mt-2 new-poll-form" id="poll-form">
        <div class="card card-body">
          {% include "polls/_poll_form.html" %}
        </div>
      </div>
    {% if topic.polls.count == 0 %}
      <br>
      <div class="container no-polls-message">
        <p>There are no polls for this topic.  Create the first!</p>
      </div>
    {% else %}
      {% for poll in topic.polls.all %}
        {% include "polls/_poll.html" %}
      {% endfor %}
    {% endif %}
  </div>
{% endblock %}

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Создайте файл forms.py в вашем приложении.

Напишите что-то вроде этого:

from .models import Poll

class PollForm(forms.ModelForm):

  class Meta:
        model = Poll
        fields = ('name', 'topic',)

А затем импортируйте PollForm в views.py и передайте его в шаблон

from polls.forms import PollForm

 class CreatePoll(LoginRequiredMixin, generic.CreateView):
        template_name = 'polls/_poll_form.html'
        model = Poll
        form_class = PollForm
0 голосов
/ 16 ноября 2018

Это довольно распространенная путаница, но я не совсем понимаю, как она возникает.

Простое включение шаблона в другой не означает, что представление, в котором упоминается этот шаблон, выполняется. Шаблоны рендеринга представлений, шаблоны не вызывают представления. Представления вызываются только пользователем, запрашивающим URL, который обрабатывается этим представлением. В вашем случае URL-адрес указывает на совершенно другой URL-адрес, а тот, который создает форму, никогда не вызывается.

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

...