Как сохранить пользователя при сохранении формы с использованием post в представлениях на основе классов в Django

#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 экземпляр, и вы добавляете сюда дополнительный запрос к базе данных без уважительной причины.