как задавать ForeignKey автоматически, в зависимости от того, в какой форме создается элемент

Я создаю todo приложение с наличием групп для задач

screen

'Add list' - сюда юзер вводит название задачи. Как сделать так, чтобы группа определялась автоматически, а не приходилось выбирать ее вручную в "whichGroup"

мой код

models.py

from django.db import models
import datetime


class CreateGroupOfTasks(models.Model):
    title = models.CharField(max_length=40, db_index=True)
    pub_date = models.DateTimeField('date published',
                                default=datetime.datetime.now())

    def __str__(self):
        return self.title


class CreateList(models.Model):
    whichGroup = models.ForeignKey(CreateGroupOfTasks, null=True,
                               on_delete=models.CASCADE)
    title = models.CharField(max_length=40)
    pub_date = models.DateTimeField('date published', default=datetime.datetime.now())

    def __str__(self):
        return self.title


class Createtask(models.Model):
    whichList = models.ForeignKey(CreateList,
                               on_delete=models.CASCADE, null=True)
    titleTask = models.CharField(max_length=40)
    pub_date = models.DateTimeField('date published', default=datetime.datetime.now())


    def __str__(self):
        return self.titleTask

forms.py

from django import forms
from .models import Createtask, CreateGroupOfTasks, CreateList


class AddListForm(forms.ModelForm):
    title = forms.CharField(label="", max_length=40, widget=forms.TextInput(
        attrs={
            'type': 'text', 'class': 'new list fontsize', 'placeholder':
                'Add List',
            'aria-label': 'add list'}))

    class Meta:
        model = CreateList
        fields = ['title', 'whichGroup']


class AddGroupForm(forms.ModelForm):
    title = forms.CharField(label=" ", max_length=40, widget=forms.TextInput(
        attrs={
        'type': 'text', 'class': 'new list font_size add_group', 'placeholder': 'Add Group',
    'aria-label': 'add group'}))

    class Meta:
        model = CreateGroupOfTasks
        fields = ['title']




class AddItemForm(forms.ModelForm):
    title = forms.CharField(label="", max_length=40, widget=forms.TextInput(
        attrs={
        'type': 'text', 'class': 'new item', 'placeholder': 'Add item',
    'aria-label': 'add list'}))

    class Meta:
        model = Createtask
        fields = ['title']

views.py

from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from toodooLogic.forms import AddListForm, AddGroupForm, AddItemForm
from toodooLogic.models import Createtask, CreateGroupOfTasks, CreateList

@login_required
def index(request):


    if request.method == 'POST':
        if 'addlist' in request.POST:
            form1 = AddListForm(request.POST)
            if form1.is_valid():
                form1.save()
        elif 'addgroup' in request.POST:
            form2 = AddGroupForm(request.POST)
            if form2.is_valid():
                form2.save()

        elif 'additem' in request.POST:
            form3 = AddItemForm(request.POST)
            if form3.is_valid():
                form3.save()
        return redirect('/')

    context = {
        'listForm': AddListForm,
        'groupForm': AddGroupForm,
        'itemForm': AddItemForm,
        'tasks': Createtask.objects.all(),
        'groups': CreateGroupOfTasks.objects.all(),
        'lists': CreateList.objects.all(),
}
    return render(request, "index.html", context)

index.html

    <div class="all_tasks">
        {% for group in groups %}
                    <div class="group">
        <div class="grouping">
            <button class="btn list group" aria-label="open group">></button>
            <h2 class="task_list_title">{{ group.title }}</h2>
        </div>

                        {% for list in lists %}
                        {% if list.whichGroup == group %}
        <ul class="task_list">
            <li><a href="">{{ list }}</a></li>
        </ul>
                        {% endif %}
                        {% endfor %}
        <form class="add_new_list" method="POST">
            {% csrf_token %}
            {{ listForm }}
            <input class="btn list" aria-label="create new list" type="submit"
                    name="addlist">+
            </input>
        </form>
                    </div>
        {% endfor %}

        <form class="add_new_group" method="POST">
            {% csrf_token %}
            {{ groupForm }}
            <input class="btn list" aria-label="create new group" type="submit"
                    name="addgroup">+
                </input>
        </form>
    </div>

Ответы (1 шт):

Автор решения: Andrey Maslov

Исключи это поле из формы. Добавь его к url, который формируется для action каждой формы. например:

<form class="add_new_list" method="POST" action="{% url "add_new_list" group.pk %}">

в urls.py что-то вроде такого:

    path('list/new/<int:pk_group>', add_new_list_view, 'add_new_list')

и соответсвенно во view, в котором добавляешь данные:

def add_new_list_view(request, pk_group):
    pk_group = CreateGroupOfTasks.objects.get(pk=pk_group)
    form = AddListForm(request.POST or None):
    if request.POST:
        if form.is_valid():
            new_list = form.save(commit=False)
            new_list.whichGroup = pk_group
            new_list.save()
            редирект...
   ...

либо можешь передавать параметр pk_group в форму и обрабатывать там

→ Ссылка