@slmuim

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

В проекте есть две модели: Client и Order. Модель Order связана с моделью Client с помощью ForeignKey.
Задача такая:
При создании клиента (Записи в модель Client), нужно чтобы пользователя перенаправило со страницы создания клиента на страницу создания заказа, с уже выбранным только что созданным клиентом.

models.py
class Client(models.Model):
    name = models.CharField('ФИО клиента', max_length=100, unique=True)
    phone = models.CharField('Телефон', max_length=9)

class Orders(models.Model):
    client = models.ForeignKey(Client, verbose_name='Клиент', on_delete=models.PROTECT)
    price = models.PositiveIntegerField('Цена', help_text='USD')
    amount = models.PositiveIntegerField('Сумма', help_text='USD')


views.py
class AddClient(LoginRequiredMixin, CreateView):
    form_class = AddClientForm
    template_name = 'clients/add_client.html'
    login_url = reverse_lazy('login')

    def form_valid(self, form):
        form.save()
        return redirect('add_order')

class AddOrder(LoginRequiredMixin, CreateView):
    form_class = AddOrderForm
    template_name = 'clients/add_order.html'
    login_url = reverse_lazy('login')

    def form_valid(self, form):
        form.save()
        return redirect('start')
  • Вопрос задан
  • 133 просмотра
Решения вопроса 1
AlexNest
@AlexNest
Работаю с Python/Django
Уже писал, по идее -на почте должен быть более менее - полный ответ.
Вариант 1:
Использовать сессию.
В AddClient сохранять id в нее
client = form.save()
request.session['client_id'] = client.id
request.session.modified = True

В AddOrder, сохранять форму с commit=False и добавлять id из сессии, после чего - удалять ключ из нее (также с ...modified = True)
UPD: Нужно будет обновить модель, изменив FK и сделав его null/blank=True.
Ну и проверять перед сохранением заказа, есть ли в сессии нужный ключ.
Плюсы: можно продолжить редактирование, даже после создания юзера и закрытия браузера.
Минусы: без дополнительной обработки (например - запрет на модификацию существующего в сессии ключа) может возникнуть случай когда юзер перезаписывается до создания заказа.
Вариант 2:
redirect(reverse('app:view', kwargs={ 'bar': FooBar })) # Id записывать в kwargs

Плюсы: не возникнет указанной выше ситуации.
Минусы: нужно модернизировать url
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы