как задавать ForeignKey автоматически, в зависимости от того, в какой форме создается элемент
Я создаю todo приложение с наличием групп для задач
'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 в форму и обрабатывать там
