Задать вопрос
@ErikHabr

Как связать формы в джанго между собой?

Народ пожалуйста помогите! Всю неделю с этим мучаюсь.
Вообщем у меня две формы на одной странице, одна форма должна автоматом в селекте подставлять название блока в котором мы находимся (это работает), а вторая должна в зависимости в каком блоке мы находимся в селекте предоставить варианты выбора категорий только этого блока, надеюсь понятно объяснил.

# views.py file # views.py file # views.py file # views.py file # views.py file # views.py file 
class AddTable(SuccessMessageMixin, CreateView):
    model = TableCategory
    form_class = TableCategoryForm
    second_form_class = TableItemsForm
    template_name = 'forms/table_add.html'
    success_url = '.'
    success_message = "Категория таблицы успешно добавленна"

    def get_initial(self):
        initial = super(AddTable, self).get_initial()
        initial['block'] = CreateBlock.objects.get(pk=self.kwargs['pk'])
        return initial

    def get_context_data(self, **kwargs):
        context = super(AddTable, self).get_context_data(**kwargs)
        context['tablecat'] = TableCategory.objects.filter(block=self.kwargs['pk'])
        context['tableitem'] = TableItems.objects.all()

        #if 'formcat' not in context:
        #    context['formcat'] = self.form_class()
        if 'form2' not in context:
            context['form2'] = self.second_form_class()
        return context
        
# forms.py file # forms.py file # forms.py file # forms.py file # forms.py file # forms.py file      
class TableCategoryForm(forms.ModelForm):
    class Meta:
        model = TableCategory
        fields = '__all__'
        #widgets = {'block': forms.HiddenInput}

class TableItemsForm(forms.ModelForm):
    class Meta:
        model = TableItems
        fields = '__all__'

# models.py file # models.py file # models.py file # models.py file # models.py file # models.py file
# tables models
class TableCategory(models.Model):
    """ table category  """
    block = models.ForeignKey(CreateBlock, on_delete=models.CASCADE, related_name='blocktablecat', default=0)
    category = models.CharField(max_length=50)

    def __str__(self):
        return self.category

    class Meta:
        verbose_name = 'Категория таблицы'
        verbose_name_plural = 'Категории таблицы'

class TableItems(models.Model):
    """ table items  """
    category = models.ForeignKey(TableCategory, related_name='tableitems', on_delete=models.PROTECT)
    name = models.CharField(max_length=50)
    price = models.SmallIntegerField(default=0)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'Содержимое таблицы'
        verbose_name_plural = 'Содержимое таблицы'


# urls.py file # urls.py file  # urls.py file  # urls.py file 
path('block/<int:pk>/add/table/', views.AddTable.as_view(), name='add_table'),

# html file # html file # html file # html file # html file
<form method="post">
   {% csrf_token %}
   {{ form|crispy }}
   <button type="submit" class="btn btn-primary btn-sm waves-effect waves-light">Добавить</button>
  </form>
 </div>
 <div class="col-md-7">
  <form method="post">
   {% csrf_token %}
{{ form2|crispy }}
   <button type="submit" class="btn btn-primary btn-sm waves-effect waves-light">Добавить</button>
  </form>
 </div>
</div>


<div class="box-content">
{% if tablecat %}
  {% for cat in tablecat %}
      <table class="table table-striped">
        <p class="table_head">{{ cat.category }}</p>
          {% for item in cat.tableitems.all %}
         <tr>
          <td>{{ item.name }}</td>
          <td>{{ item.price }} руб</td>
         </tr>
          {% endfor %}
      </table>
    {% endfor %}
{% else %}
  <p>Вы еще не создали объектов для таблицы. Заполните формы выше.<br/>
    Сначала создайте категорию для определенных объектов, затем добавьте сами объекты в созданную категорию и т.д.</p>
{% endif %}
</div>
  • Вопрос задан
  • 243 просмотра
Подписаться 1 Средний 2 комментария
Решения вопроса 1
tumbler
@tumbler Куратор тега Django
бекенд-разработчик на python
Вот так это делается с помощью autocomplete-light. Можете или воспользоваться библиотекой, или подсмотреть там реализацию на JS.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
Strikt Москва
от 100 000 до 180 000 ₽
ITK academy Саратов
от 75 000 ₽
Sim-Ba Pay Санкт-Петербург
от 180 000 ₽