#python #django #django-views #django-forms
#python #django #django-представления #django-forms
Вопрос:
В настоящее время экземпляр формы сохраняется, но пользователь, который заполнил информацию, не сохраняется при сохранении этой формы. Мне интересно, как захватить пользователя и добавить его к созданию нового объекта формы.
class ObjectListView(LoginRequiredMixin, FormMixin, ListView):
model = Object
template_name = 'ui/home.html'
context_object_name = 'objects'
form_class = OrderForm
def post(self, request, *args, **kwargs):
form = self.get_form()
if form.is_valid():
form.save()
order_type = form.cleaned_data.get('order_type')
price = form.cleaned_data.get('price')
**user = request.user**
messages.success(request, f'Your order has been placed.')
return redirect('account')
Комментарии:
1. У вас есть пользователь,
user = request.user
так что просто поместите его туда, куда вы хотите? Я предполагаю, что заказ имеет FK для пользователя?2. Нужно ли сохранять пользователя в
Object
модели?3. @Mugoma да, это нужно сохранить в объектной модели
Ответ №1:
Чтобы добавить больше информации перед сохранением формы, вы можете использовать параметр commit=False
views.py
class ObjectListView(LoginRequiredMixin, FormMixin, ListView):
...
def post(self, request, *args, **kwargs):
...
if form.is_valid():
obj = form.save(commit=False)
obj.user = request.user ## Assuming that the relevant field is named user, it will save the user accessing the form using request.user
obj.save()
...
return redirect('account') ## this should be indented if it is to work only on successfully saving the form
Комментарии:
1. Ваш ответ наиболее близок к тому, что хочет OP, но ваш код не будет работать. Вам нужно использовать переменную, чтобы сохранить то, что
form.save(commit=False)
возвращается, напримерobj=form.save(commit=False)
. Затем вы можете использоватьobj.user=request.user
.
Ответ №2:
Вы можете извлечь объект user из User
модели django и сохранить объект с помощью save
метода.
from django.contrib.auth.models import User
class ObjectListView(LoginRequiredMixin, FormMixin, ListView):
model = Object
template_name = 'ui/home.html'
context_object_name = 'objects'
form_class = OrderForm
def post(self, request, *args, **kwargs):
user = User.objects.get(id=request.user.id) #fetch the user object
form = self.get_form()
if form.is_valid():
form.save()
order_type = form.cleaned_data.get('order_type')
price = form.cleaned_data.get('price')
user.save() #saves/updates the user
messages.success(request, f'Your order has been placed.')
return redirect('account')
Комментарии:
1. Если
request.user
существует, то это ужеUser
экземпляр, и вы добавляете сюда дополнительный запрос к базе данных без уважительной причины.