python - 表单或模型中的 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']
网页图片:
解决方案
您需要在初始化表单时传递用户,然后为可以选择的可用课程过滤查询集
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)
推荐阅读
- html - 在下一次加载 .html 时使用 app.js 加载从 html 表单保存的变量
- node.js - Sequelizejs从关系表中获取字段到关联belongsToMany
- ruby-on-rails - 如何更新项目中的 Rails 版本?Bundler 找不到 gem “activemodel” 的兼容版本
- c# - 如何将注册中设置的值显示到 seevalue() 函数中?范围
- javascript - 如何通过状态向单选按钮添加标签
- amazon-web-services - 未知错误,来自 fetch 的响应正文未定义
- mysql - 如何将具有许多这样的关系的列分组?
- aurelia - Aurelia 路由器,仅 html 视图,添加一些 javascript?
- prolog - 如何在序言中找到递归余数(没有算术)
- c# - 如何确保门票不会超过允许的销售量?