附加的图像显示我当前的问题。图片中的数学270和数学280是由另一个用户创建的,而不是创建了Jays课程的Jay。但是其他用户目前已登录,而不是周杰伦。如何只将登录用户创建的课程(而不是周杰伦)显示在该下拉菜单中?
在我的观点中,我有以下尝试解决问题:
class CreateQuestion(LoginRequiredMixin, CreateView):
model = Question
fields = ["title", "question", 'classe']
template_name = "attendance_test/add_test.html"
def form_valid(self, form):
form.instance.instructor = self.request.user
return super(CreateQuestion, self).form_valid(form)
def get_context_data(self, **kwargs):
context = super(CreateQuestion, self).get_context_data(**kwargs)
context['classe'] = Classe.objects.filter(professor=self.request.user.id)
return context
def get_initial(self):
return { 'classe': Classe.objects.filter(professor=self.request.user.id) }
我的问题模型:
class Question(models.Model):
title = models.CharField(max_length=100)
question = models.TextField(max_length=500)
date_pub = models.DateTimeField(auto_now_add=True)
instructor = models.ForeignKey(Teacher, on_delete=models.CASCADE, default="")
# this is where all the courses are showing up, I only want those
# created by the "instructor" to show up, not all instructors
classe = models.ForeignKey(Classe, on_delete=models.CASCADE, null=True)
def professor_classes(self):
return Classe.objects.filter(professor=self.professor)
教师模型:
class Teacher(User):
isProfessor = models.BooleanField(default=False)
professor_courses = models.ForeignKey('Classe', on_delete=models.CASCADE, null=True)
如果有多达1000个类的说法,这个问题将是一个问题,但是一个教师只考虑4,当996与他们无关时显示所有1000是没有意义的。为了记录我之前问过这个问题,我得到了答案,但我仍然无法解决。
答案 0 :(得分:1)
def get_form(self, form_class):
form = super(CreateQuestion, self).get_form(form_class)
form.fields['classe']= Classe.objects.filter(professor=self.request.user.id)
return form
你可以尝试这样的事情
答案 1 :(得分:1)
根据您构建Django应用程序的方式,有很多方法可以解决此问题。例如,一种方法可能是:
class QuestionForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
professor = kwargs.pop('professor')
super(QuestionForm, self).__init__(*args, **kwargs)
self.fields['classe'].queryset = Classe.objects.filter(professor=professor)
class Meta:
model = Question
fields = ('title', 'question', 'classe')
class CreateQuestionView(LoginRequiredMixin, CreateView):
form = QuestionForm
template_name = "attendance_test/add_test.html"
def get_form_kwargs(self):
kwargs = super(CreateQuestionView, self).get_form_kwargs()
kwargs['professor'] = self.request.user
return kwargs
def form_valid(self, form):
form.instance.instructor = self.request.user
return super(CreateQuestionView, self).form_valid(form)
根据当前登录的用户过滤类。
虽然我认为从Teacher
继承User
模型是不正确的。在这种情况下,更高效和传统的解决方案是使用聚合:
class Teacher(models.Model):
user = models.ForeignKey(User)
# or
#user = models.OneToOneField(User)
此外,您的代码存在问题:initial
是表单字段的初始选定值,它不是允许值的范围。通过设置initial
,您可以为表单字段设置初始选定值。
context
是传递到模板中的变量的字典。因此,我认为您无需在视图中定义get_context
(或者至少不需要传递Classes
列表)。