获取某些值以django形式显示

时间:2017-05-28 01:03:05

标签: python django

Image displaying issue

附加的图像显示我当前的问题。图片中的数学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是没有意义的。为了记录我之前问过这个问题,我得到了答案,但我仍然无法解决。

2 个答案:

答案 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列表)。