首页 > 解决方案 > 简单的应用程序,但每个组中有不同的任务(多对一关系)

问题描述

主要问题:当用户在这个 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'),
]

标签: djangodjango-viewsdjango-forms

解决方案


一旦你在 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']


推荐阅读