django - 简单的应用程序,但每个组中有不同的任务(多对一关系)
问题描述
主要问题:当用户在这个 url http://127.0.0.1:8000/8/时,group_id 已经在他当前页面的 url 中,如果我fields = ['title', completed']
在表单中执行,他必须选择他想要分配任务的 group_id。 py 用户不能选择 group_id 但他需要。我有主键,但我不知道在视图中应用它的位置
PS:views.py 中的 IndexView 没有问题并且工作正常,GroupView 中的 get 方法也可以正常工作。一切正常,但用户需要选择一个他想要分配任务的组
表格.py:
from django import forms
from .models import *
class AddTaskForm(forms.ModelForm):
class Meta:
model = Task
fields = '__all__'
class AddGroupForm(forms.ModelForm):
class Meta:
model = Group
fields = '__all__'
模型.py
from django.db import models
from django.utils import timezone
class Group(models.Model):
title = models.CharField(max_length=255)
def __str__(self):
return self.title
class Task(models.Model):
title = models.CharField(max_length=255)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
completed = models.BooleanField(default=False)
def __str__(self):
return self.title
视图.py
from django.shortcuts import render, redirect
from django.views import generic
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse
from .models import *
from .forms import *
class IndexView(generic.ListView):
template_name = 'tasks/index.html'
form_class = AddGroupForm
model = Group
def get_queryset(self):
return self.groups.order_by('title')
def get(self, request):
self.groups = Group.objects.all().order_by('title')
form = self.form_class(request.GET)
return render(request, self.template_name, {'form': form, 'groups': self.groups})
def post(self, request):
form = self.form_class(request.POST)
if form.is_valid():
form.save()
return redirect('/')
return render(request, self.template_name, {'form': form, 'groups': self.groups})
class GroupView(generic.ListView):
template_name = 'tasks/group.html'
form_class = AddTaskForm
model = Task
def get_queryset(self):
return self.tasks.order_by('-completed', 'title')
def get(self, request, pk):
self.group_id = pk
self.tasks = Group.objects.get(pk=pk).task_set.all()
form = self.form_class(request.GET, pk)
return render(request, self.template_name, {'form': form, 'tasks': self.tasks})
def post(self, request, pk):
form = self.form_class(request.POST)
if form.is_valid():
form = form.save(commit=False)
form.group_id = pk
form.save()
return HttpResponseRedirect(reverse('tasks:group', args=[pk]))
urls.py
from django.urls import path
from . import views
app_name = 'tasks'
urlpatterns = [
path('', views.IndexView.as_view(), name = 'index'),
path('<str:pk>/', views.GroupView.as_view(), name = 'group'),
]
解决方案
一旦你在 url 中有 id,你就可以在 form valid 方法中使用它。这是在写入数据库之前添加信息的地方:
def form_valid(self, form):
form.instance.group= Group.objects.get(pk=self.kwargs['pk'])
return super().form_valid(form)
顺便说一句:您的 url 可能是<int:pk>
(不是 str),因为自动生成的 pks 是整数。您可以为您的参数提供一个更好的名称。像<int:group_pk>
这样使您的代码更具可读性:self.kwargs['group_pk']
推荐阅读
- azure-devops-rest-api - 当触发器设置为无时使用 REST API 启动 azure-devops 管道
- tsql - CREATE TABLE ... AS SELECT 使用派生表
- android - Android/IOS Native WooCommerce Marketplace App 一般组织
- firebase - 无论输入或函数名称如何,httpsCallable 在使用 expo 运行模拟器并反应原生时都会返回错误:“internal”
- c# - 如何从列表中找到人的姓名
- python - 使用Python下载api数据
- reactjs - 在反应中处理复选框验证并从选中的复选框创建父/子对象
- azure - 何时应在 CosmosDB 中创建新容器?
- mysql - 组合 SQL 查询缺少操作数(错误 #1241)...我做错了什么?
- gridstack - Gridstack 删除特定元素