首页 > 解决方案 > 表单或模型中的 Django 外键字段验证(仅从外键获取由该用户创建的信息)

问题描述

我正在尝试构建课程并稍后将课程添加到课程中,我遇到的问题是每个用户都可以选择将课程添加到另一个人创建的课程中。就像您创建一些课程一样,其他用户将看到将他的课程添加到其中的选项

视图.py

def creatingLessonsForm(request):
    form = CreatingLessonsForm(request.POST or None)
    if form.is_valid():
        post = form.save(commit=False)
        post.CreatedBy = request.user
        post.save()
        form = CreatingLessonsForm()

    context = {'form': form}
    return render(request, 'courses/creatingLessonsForm.html', context)

模型.py

class CreatingCourses(models.Model):
    NameOfTheCourses = models.CharField("Name of the courses", max_length=60, blank=False)
    Category = models.ForeignKey(Subject, on_delete=models.CASCADE)
    CreatedBy = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    Document = models.ForeignKey(Document, on_delete=models.SET_NULL, verbose_name= "Select document for courses introduction",  blank=True , null=True)
    IncludeTest = models.ForeignKey(GenaratedTest, on_delete=models.SET_NULL, verbose_name= "Include test for courses", blank=True , null=True)
    AdditionalInfo = models.TextField("Additional info for courses introduction", max_length=300, blank=False)
    Note = models.TextField("Notes", max_length=180, blank=True)
    Show_the_courses = models.BooleanField(verbose_name= "Show the courses for everyone?",default=True)

    def __str__(self):
        return str(self.NameOfTheCourses) if self.NameOfTheCourses else ''

class CreatingLessons(models.Model):
    Courses = models.ForeignKey(CreatingCourses, on_delete=models.SET_NULL, null=True)
    NameOfTheLesson = models.CharField(max_length=60, verbose_name= "Name of the lesson",  blank=False)
    Document = models.ForeignKey(Document, on_delete=models.SET_NULL, verbose_name= "Document for lesson",  blank=True , null=True)
    CreatedBy = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    Lesson = models.TextField(max_length=250, verbose_name= "Lesson", blank=False)
    Note = models.TextField("Notes", max_length=100, blank=True)
    Show_the_lesson = models.BooleanField(verbose_name= "Show the lesson inside courses?",default=True)

表格.py

class CreatingCoursesForm(forms.ModelForm):
    class Meta:
        model = CreatingCourses
        fields = ['NameOfTheCourses', 'Category', 'IncludeTest', 'Document'  , 'AdditionalInfo', 'Note', 'Show_the_courses' ]   

class CreatingLessonsForm(forms.ModelForm):
    class Meta:
        model = CreatingLessons
        fields = ['Courses', 'NameOfTheLesson', 'Document', 'Lesson', 'Note', 'Show_the_lesson']    

网页图片:

图片

标签: pythondjangodjango-forms

解决方案


您需要在初始化表单时传递用户,然后为可以选择的可用课程过滤查询集

class CreatingLessonsForm(forms.ModelForm):

    def __init__(self, data=None, user=None, **kwargs):
        super().__init__(data, **kwargs)
        self.fields['Courses'].queryset = CreatingCourses.objects.filter(CreatedBy=user)

然后当你初始化表单时传递用户

# When rendering the initial form
form = CreatingLessonsForm(user=request.user)
# When passing POST data to the form
form = CreatingLessonsForm(request.POST, user=request.user)

推荐阅读