Django: передать request.user для формирования с использованием класса FormView - PullRequest
0 голосов
/ 22 января 2020

У меня есть модель List, связанная с ForeignKey с моделью пользователя.

Я использую класс FormView, чтобы показать эту форму в шаблоне, помимо отправки переменного контекста listas, то есть queryset всех объектов List, связанных с вошедшим в систему пользователем.

Однако, передавая пользователю форму перед ее сохранением, я получаю эту ошибку:

TypeError at /listas/
__init__() got an unexpected keyword argument 'user'

Я открыт для пользователя CreateView, так как, согласно моим исследованиям, мне больше подходит необходимость создания новой записи и отображения набора запросов в шаблоне.

models.py:

class List(models.Model):
    LISTA_STATUS = (
        ('recibida_pagada', 'Recibida y pagada'),
        ('recibida_no_pagada', 'Recibida pero no pagada'),
        ('en_revision', 'En revision'),
        ('en_camino', 'En camino'),
        ('entregada', 'Entregada'),
        ('cancelada', 'Cancelada')
    )
    name = models.CharField(max_length=100, default='Lista anónima')
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    school = models.OneToOneField(School, on_delete=models.CASCADE, null=True, blank=True)
    status = models.CharField(max_length=20, choices=LISTA_STATUS, default='recibida_no_pagada')
    created_at = models.DateTimeField(auto_now_add=True)
    modified_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['created_at']

    def __str__(self):
        return str(self.id)

views.py:

class ListFormView(LoginRequiredMixin, FormView):
    form_class = ListForm
    template_name = "scolarte/listas.html"
    success_url = reverse_lazy('lists:my_lists')

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        context['listas'] = List.objects.filter(user=request.user)
        return self.render_to_response(context)

    def form_valid(self, form):
        form = ListForm(data=self.request.POST, user=self.request.user)
        form.save()
        return super(ListFormView, self).form_valid(form)

html :

{% block content %}

<div class="container">
    <div class="row">
        <div class="col-xl-12">
            <!-- START HEADER Content -->
            <h1 class="display-4 mb-3 mt-2">
                Mis Listas
            </h1>
            <!-- END HEADER Content -->
        </div>
    </div>

    <div class="row">
        <form action="{% url 'lists:my_lists' %}" method="post">
            {% csrf_token %}
            {{ form }}
            <input type="submit" value="Submit">
        </form>
    </div>

    <div class="row mt-5">
        {% for lista in listas %}
            <!-- START CONTENT -->
            <div class="card-deck">
                <a href="{% url 'lists:list_details' lista.id %}">
                <div class="card">
                  <div class="card-body">
                    <p>{{ lista.school.name }}</p>
                    <h5 class="card-title">{{ lista.name }}</h5>
                    <p class="card-text"><small class="text-muted">Última modificación: {{ lista.modified_at }}</small></p>
                  </div>
                </div>
                </a>
            </div>
            <!-- END Card Counter -->                                        
        {% endfor %}
    </div>


{% endblock %}

urls.py:

от. импорт представлений

app_name = "lists"

urlpatterns = [
    path('', views.ListFormView.as_view(), name='my_lists'),
    path('agregar-producto/', views.add_product_to_list, name='add_product_to_list'),
    path('mis-listas/', views.update_lists_count, name='update_lists_count'),
    path('lista-detalles/<int:lista_id>/', views.list_details, name='list_details'),
]

1 Ответ

0 голосов
/ 22 января 2020

Спасибо @hendrikschneider за указание на этот пост:

Как настроить поле пользователя в форме для текущего пользователя?

Решение исключить пользователя в forms.py:

class ListForm(ModelForm):

    class Meta:
        model = List
        exclude = ["user"]
        fields = ('name', 'school')

и изменить метод FormView Post на:

class ListFormView(LoginRequiredMixin, FormView):
    form_class = ListForm
    template_name = "scolarte/listas.html"
    success_url = reverse_lazy('lists:my_lists')

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        context['listas'] = List.objects.filter(user=request.user)
        return self.render_to_response(context)

    def form_valid(self, form):
        form = form.save(commit=False)
        form.user = self.request.user  
        form.save()
        return HttpResponseRedirect(self.get_success_url())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...