2014-01-13 109 views
1

出现在的ModelForm可以说我有类似下面的模式:选择哪些字段根据用户

class Patient(models.Model): 
    #has some fields 
    doctor = models.ForeignKey(User) 

所以患者模型有医生认为对待他。我也有模型形式

class PatientForm(ModelForm): 
    class Meta: 
     model=Patient 

所以所有的领域都包括在内。让我们说现在frontdesk(nonstaff)可以创建病人,并且必须在他们身上签上一名医生。所以PatientForm的工作原因是医生领域将正常出现。但是医生也可以创建患者,但是当医生(工作人员用户)创建患者时,医生领域必须由关联用户自动填写,而不是在模板中呈现。例如:

if request.user.is_staff(): 
    form = #PatientForm_without_doctor_field 
else: 
    form = PatientForm() 

可以使用相同的PatientForm类来完成吗?必须使用不同的ModelForms(一个包含字段,另一个不包含医生)是否更好,并据此使用它?这是最好的方法吗?在构造函数中使用request.user创建新的模型表单会更好吗?

回答

1

通行证request.user以形成INIT在查看:

def some_view(request): 
    form = PatientForm(user=request.user) 

并修改为根据用户在表单的Init形式创建后M场:

from django.contrib.auth.models import AnonymousUser 

class PatientForm(ModelForm): 
    class Meta: 
     model=Patient 

    def __init__(self, *args, **kwargs): 
     user = kwargs.pop('user', AnonymousUser()) 
     super(PatientForm, self).__init__(*args, **kwargs) 
     if user.is_staff(): 
      # hide field and set doctor to request.user 
      self.fields['doctor'].widget = forms.HiddenInput() 
      self.fields['doctor'].initial = user 
+0

这就是我的想法。也许有一种方法来包括或排除领域像self.exclude('医生') – Apostolos

+0

@Apostolos我认为你可以排除字段只是通过从字段中删除表单init方法,但在这种情况下,你需要覆盖保存方法通过'request.user'到你的模型'医生'字段... – ndpu

+0

所以在构造函数del self.fields ['dotor']里面如果user.is_staff对不对?但后来我必须手动设置patients.doctor = request.user后保存表单与commit = False是否正确? – Apostolos

0

[编辑]虽然初始化可以基于关键字参数设置初始值:

class PatientForm(ModelForm): 

    def __init__(self, readonly_doctor=None, *args, **kwargs): 
     super(StudentForm, self).__init__(*args, **kwargs) 
     if readonly_doctor is not None: 
      self.fields['doctor'].widget.attrs['readonly'] = True 
      self.fields['doctor'].initial = readonly_doctor 

    class Meta: 
     model=Patient 

然后,可以有条件地传递:

if request.user.is_staff(): 
    form = PatientForm(readonly_doctor=request.user) 
else: 
    form = PatientForm() 
+0

没有得到它...保存方法是commiting形式......我说的是在此之前,步骤...渲染。 – Apostolos

+0

对不起,现在理解你的问题了。 – arocks

+0

没问题....那是我最初的想法,虽然...构造函数... – Apostolos