2017-07-30 76 views
-1

有一个应用程序,教师可以在其中注册个人学生的课程。如果老师添加了新课程,他将自动注册为教授本课的老师。所以在一种形式中,没有像'Teacher'这样的字段,因为request.user用于这个数据。根据用户所属的组可以显示用户字段

但我还希望管理员为老师注册一课。那么这个表单也应该有一个'教师'字段。什么是正确的做法?

models.py

class Lesson(models.Model): 
    pupil = models.ForeignKey(Pupil, on_delete=models.CASCADE) 
    teacher = models.ForeignKey("auth.User", 
           limit_choices_to={'groups__name': "teachers"}) 

views.py

class LessonCreate(PermissionRequiredMixin, CreateView,): 
    model = Lesson 
    fields = ['pupil', 'subject', ] 
    permission_required = 'foreigntest.add_lesson' 
    def form_valid(self, form): 
     obj = form.save(commit=False) 
     obj.teacher = self.request.user 
     obj.save() 

所以我想我要补充'Teacher'到字段列表中,如果用户属于管理类,对吧?

+0

所以,你取得了你想要做的? – hansTheFranz

回答

1

你应该自己创建这个Form,这将允许你覆盖基于用户的字段。

forms.py

class LessonCreateForm(ModelForm): 
    class Meta: 
     model = Lesson 
     fields = ['pupil', 'subject', 'teacher'] 

    def __init__(self, *args, **kwargs): 
     user = self.kwargs.pop('user', None) 
     super(LessonCreateForm, self).__init__(*args, **kwargs) 

     # This is the special part - we leave the teacher field in by default 
     # When the form is created, we check the user and see if they are an admin 
     # If not, remove the field. 
     if not user.is_admin: 
      self.fields.pop('teacher') 

当您在views.py形式,需要在用户kwarg经过:

class LessonCreate(PermissionRequiredMixin, CreateView,): 
    model = Lesson 
    fields = ['pupil', 'subject', ] 
    permission_required = 'foreigntest.add_lesson' 
    form_class = LessonCreateForm 

    def get_form_kwargs(self): 
     kwargs = super(UserFormKwargsMixin, self).get_form_kwargs() 
     # Update the existing form kwargs dict with the request's user. 
     kwargs.update({"user": self.request.user}) 
     return kwargs 

    def form_valid(self, form): 
     obj = form.save(commit=False) 
     obj.teacher = self.request.user 
     obj.save() 

我把get_form_kwargs()直接从django-braces我强烈建议 - 你可以将UserFormKwargsMixin添加到您的视图中,并将UserKwargModelFormMixin添加到您的表单中,然后跳过用户的所有弹出窗口。

相关问题