Django:使用FormView类将request.user传递给表单



我有一个与ForeignKey到用户模型相关的模型List

我使用FormView类在模板上显示此表单,此外还发送了一个变量上下文listas,它是与登录用户相关的所有List对象的queryset

然而,在保存表单之前将用户传递给表单,会出现以下错误:

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

我对用户CreateView持开放态度,因为根据我的研究,它更适合我创建新记录并在模板上显示查询集的需求。

型号.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)

视图.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'),
]

感谢@hendrikschneider为我介绍这篇文章:

如何将表单中的用户字段设置为当前登录的用户?

解决方案是排除表单中的用户.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())

最新更新