@JonGalt

Создание объектов сразу в 2 моделях django?

Есть 2 модели

class QualityControl(models.Model):
    object = models.ForeignKey(Object, verbose_name=u'Объект')
    type = models.ForeignKey(QCType, verbose_name=u'Тип контроля')
    company = models.ForeignKey(Company, verbose_name=u'Организация')
    number = models.CharField(max_length=200, verbose_name=u'Номер')
    date = models.DateField(verbose_name=u'Дата')

class QCConstruction(models.Model):
    qc = models.ForeignKey(QualityControl, verbose_name=u'Документ')
    work = models.ForeignKey(Work)
    construction = models.ForeignKey(Construction, verbose_name=u'Конструкция')
    value = models.CharField(max_length=128, verbose_name=u'Значение', blank=True)


Что-то не могу сообразить как сделать вьюху для создания и шаблон сразу с формой для QualityControl и с формсетом для QCConstruction
  • Вопрос задан
  • 299 просмотров
Решения вопроса 1
@JonGalt Автор вопроса
Решил таким образом:

from django.forms import inlineformset_factory

class QCWorkConstructionCreateView(TemplateView):
    template_name = 'executive/qc/qc-work-construction-create.html'

    def get_context_data(self, **kwargs):
        context = super(QCWorkConstructionCreateView, self).get_context_data(**kwargs)
        works = Work.objects.filter(id__in=self.request.GET.getlist('works'))
        # задаем начальные значения
        initial = []
        for work in works:
            for con in work.constructions.all():
                qc_con = dict()
                qc_con['construction'] = con.id
                qc_con['work'] = work.id
                qc_con['value'] = ''
                initial.append(qc_con)
        # количество отображаемых строк formset
        extra = len(initial)
        # форма для документа QC
        form = QCForm(self.request.user, {'object': self.request.user.profile.current_object_id})
        # Formset для QCConstruction
        QCformset = inlineformset_factory(QualityControl, QCConstruction, fields=('construction', 'work', 'value',), extra=extra)
        context['form'] = form
        context['formset'] = QCformset(initial=initial)
        return context

    def post(self, *args, **kwargs):
        form = QCForm(self.request.user, self.request.POST)
        if form.is_valid():
            qc = form.save()
            QCformset = inlineformset_factory(QualityControl, QCConstruction, fields=('construction', 'work', 'value',))
            formset = QCformset(self.request.POST, instance=qc)
            if formset.is_valid():
                formset.save()
                return redirect('qc_list')
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Вот такой варик

Можно вообще прямолинейно в лоб сделать, рендернуть форму на две модели, но в моделях куча зависимостей с другими моделями. Будьте уверены, что при отправке вы получите все айдишники внешних ключей. При пост запросе - сначало сохраняете запись для первой модели.
quality_control.save()
После этого у объекта quality_control есть уже свой айди и его можно впихать в запись второй модели QCConstruction
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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