@maniacus26

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

Добрый день !

Есть модель "Обращение"
Есть модель "Запрос"

После заполнения формы "Обращение" (запись в БД появилась, есть id) появляется возможность сформировать "Запрос". Нажав на кнопку и заполнив форму "Запрос", у этой записи в модели должна появиться связь с записью в модели "Обращение" из которого была вызвана форма "Запрос".
Дело в том что таких "Запросов" для одной записи "Обращение" может быть много.
Вопрос в том как передать форме "Запрос" ID записи "Обращение" в которой была нажата кнопка ?

Добавить ручной выбор "Обращения" для формы "Запись" не проблема - но это не решение. Запись должна сама, без пользователя привязаться.
  • Вопрос задан
  • 710 просмотров
Решения вопроса 1
syschel
@syschel
freelance/python/django/backend
Добавлю к Yura Khlyan,
maniacus26, самое просто решение, создавать запрос с страницы обращения. Напр:
obrashcenije/2 - страница с информацией об обращении
obrashcenije/2/dodat_zapros - страница с созданием запроса к конкретному обращению.

Тогда во вьюхе создания запроса, буде доступен парметр self.kwagrs['obr_id'], если урлу задать как-то так:

что если нужно в саму форму передать объект(ид) обращения, можно в классе вьюхи через
class ZaprosCreator(CreateView):
    form_class = ZaprosForm

    def get_initial(self):
        return {'obrashcenije': self.kwagrs['obr_id']}

Или если используется простые виды через функции, то
form = ZaprosForm(initial={'obrashcenije': self.kwagrs['obr_id']})

В форме ловить
class ZaprosForm(forms.ModelForm):
    ...
    def __init__(self, *args, **kwargs):
        super(ZaprosForm, self).__init__(*args, **kwargs)
        self.obrashcenije = kwargs.get('initial').get('obrashcenije', None)


Ну и как вариант в форме не обрабатывать вообще обращение:
class ZaprosForm(forms.ModelForm):
    class Meta:
        model = ZaprosModel
        exclude = ('obrashcenije',)

А уже во вьюхе перед сохранением формы добавить

class ZaprosView(CreateView):
    form_class = ZaprosForm

    def form_valid(self, form):
        obj = form.save(commit=False)
        obj.obrashcenije_id = self.kwagrs['obr_id']
        obj.save()
        return super(ZaprosView, self).form_valid(form)

ПС. избегайте руских названий моделей/переменных/классов, даже транслитом
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@MAGistr_MTM
Учусь программировать
На кнопке "Запрос" поставить инпут с id обращения. Потом создать запрос:
obj = form.save(commit=False)
obj.obrashchenije = request.POS.get('obrashchenije_id')
obj.save()
Ответ написан
Ваш ответ на вопрос

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

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