根据用户选择在模型中显示哪些字段

时间:2014-01-13 09:26:11

标签: python django django-forms

假设我有类似以下的模型:

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创建一个新的模型表单会更好吗?

2 个答案:

答案 0 :(得分:1)

request.user传递给视图中的init:

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

并在表单创建后根据用户在表单init中修改表单字段:

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

答案 1 :(得分: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()