python - 根据用户选择模型表单中显示哪些字段

标签 python django django-forms

假设我有一个如下所示的模型:

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

因此,患者模型有一位治疗他的医生。我还有模型表格

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

因此所有字段都包含在内。假设现在前台(非工作人员)可以创建患者,并且必须为他们指定一名医生。这样PatientForm就可以正常工作,医生字段就会正常显示。但是医生也可以创建患者,但是当医生(工作人员用户)创建患者时,医生字段必须由连接的用户自动填充,而不是在模板中呈现。像这样的东西:

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

可以使用相同的 PatientForm 类来完成吗?是否最好使用不同的模型表单(一种包含字段,一种排除医生)并相应地使用它?哪种方法最好?在构造函数中使用 request.user 建立一个新的模型表单是否更好?

最佳答案

request.user传递给 View 中的init:

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

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

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

关于python - 根据用户选择模型表单中显示哪些字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21087631/

相关文章:

python - 使用SSIM尝试比较图像并尝试分别获取亮度,对比度和结构

python - 如何获取Selenium RC服务器的版本

django - 是否有任何 Django 应用程序可以通知用户您的网络中发生的事情,并要求他执行操作?

Django:获取不存在ForeignKey的对象

django - ValidationError at [u'以 YYYY-MM-DD HH :MM[:ss[. uuuuuu] 格式输入有效的日期/时间。']

python - Django 模型表单 : Seeding a FK related field in the form

python - 电子邮件验证(1062, "Duplicate entry ''对于 key 'email'“)

python - 如何使用 Python 将 Tick by Tick 数据转换为 OHLC 烛台数据?

python - 用于温度时间序列预测的 LSTM 神经网络

python - 在 Django 的 Case When 表达式中使用多个条件