以Django形式显示某些值

2024-06-10 10:37:23 发布

您现在位置:Python中文网/ 问答频道 /正文

Image displaying issue

所附的图像显示了我当前的问题。图片中的数学270和数学280是由另一个用户创建的,而不是创建Jays课程的Jay。但是,另一个用户当前已登录,而不是Jay。我怎样才能让登录用户创建的课程,而不是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节课是没有意义的。根据记录,我以前问过这个问题,我得到了一个答案,但我还是没能解决它


Tags: 用户selfformreturnmodelsrequestdefcontext
2条回答
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

你可以试试这样的

根据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)

这将根据当前登录的用户筛选类

尽管我认为从User继承Teacher模型是不正确的。在这种情况下,更高效的传统解决方案是使用聚合:

class Teacher(models.Model):
    user = models.ForeignKey(User)
    # or
    #user = models.OneToOneField(User)

另外,您的代码也有问题:initial是表单字段的初始选定值,它不是允许的值范围。通过设置initial,可以为表单字段设置初始选定值

context是传递到模板中的变量的dict。所以我相信您不需要在视图中定义get_context(或者至少它不需要传递Classes列表)

相关问题 更多 >