Я не могу получить выбранного студента в виджете - PullRequest
0 голосов
/ 12 ноября 2018

Я использую следующий код в views.py:

        class MatriculaCreateView(CreateView):
            template_name = "website/matricula.html"
            model = CursoPeriodoEstudante
            form_class = MatriculaMembroForm
            success_url = reverse_lazy("website:lista_estudantes")

            def get_context_data(self, **kwargs):
                context = super(MatriculaCreateView, self).get_context_data(**kwargs)
                context['estudante'] = Estudante.objetos.filter(id=self.kwargs['pk'])
                context['pk'] = self.kwargs['pk']
                return context

Я создаю следующее в forms.py:

        class MatriculaMembroForm(forms.ModelForm):

            class Meta:
                # Modelo base
                model = CursoPeriodoEstudante

                # Campos que estarão no form
                fields = [
                    'estudante',
                    'cursoPeriodo'

                ]

И, наконец, в шаблоне я создал эту страницу:

        {% extends "website/_layouts/base.html" %}

            {% load widget_tweaks %}

            {% block title %}Matricula de Membros{% endblock %}

            {% block conteudo %}
            <div class="container mt-5">
              <div class="row">
                <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
                  <div class="card">
                    <div class="card-body">
                      <h5 class="card-title">Matrícula de Membros</h5>
                      <p class="card-text">
                        Complete o formulário abaixo para matricular
                        um <code>Membro</code> em um evento.
                      </p>
                      <p>Membro: {{ estudante }} </p>
                      <form method="post">
                        <!-- Não se esqueça dessa tag -->
                        {% csrf_token %}

                        <!-- Estudante -->
                        <div class="input-group mb-3">
                          <div class="input-group-prepend">
                            <span class="input-group-text">Estudante</span>
                          </div>
                          {% render_field form.estudante class+="form-control" %}
                        </div>
                        <hr>
                        <!-- Curso -->
                        <div class="input-group mb-3">
                          <div class="input-group-prepend">
                            <span class="input-group-text">Evento</span>
                          </div>
                          {% render_field form.cursoPeriodo class+="form-control" %}
                        </div>
                        <hr>
                        <div class="text-right">
                          <a href="{% url 'website:lista_estudantes' %}" class="btn btn-outline-primary">Voltar</a>
                          <button class="btn btn-primary">Enviar</button>
                        </div>
                      </form>
                  </div>
                </div>
              </div>
            </div>
            {% endblock %}

Проблема в том, что при открытии страницы я хочу, чтобы поле "Estudante" уже было заполнено тем, которое я выбрал в представлении через get_context_data (это поле можно исправить). Но поле всегда выглядит так: экран печати со страницы . Как я могу исправить, чтобы прийти со студентом , как это . Что я могу сделать? Спасибо!

Пс .: Я пытался поставить следующее, но ничего не произошло ...

            class MatriculaCreateView(CreateView):
                                template_name = "website/matricula.html"
                                model = CursoPeriodoEstudante
                                form_class = MatriculaMembroForm
                                success_url = reverse_lazy("website:lista_estudantes")

                                def get_initial(self):
                                    return {'estudante': Estudante.objetos.filter(id=self.kwargs['pk'])}

                                def get_context_data(self, **kwargs):
                                    context = super(MatriculaCreateView, self).get_context_data(**kwargs)
                                    context['estudante'] = Estudante.objetos.filter(id=self.kwargs['pk'])
                                    context['pk'] = self.kwargs['pk']
                                    return context

Ответы [ 2 ]

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

Я понял! Я должен изменить представление, чтобы получить вместо фильтра (запрос).

Спасибо!

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

Переопределите метод get_initial() для CreateView, чтобы установить начальные значения для вашей модели:

def get_initial(self):
    return {'estudante': Estudante.objects.get(id=self.kwargs['pk'])}
...