假设我有类似以下的模型:
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创建一个新的模型表单会更好吗?
答案 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()