如何在Django';s.py表格

如何在Django';s.py表格,django,forms,Django,Forms,我已经创建了一个包含性别信息的个人资料模型。还有一种称为Dorm and Registration(不用于用户注册)的模型,如下所示: class Registration(models.Model): user = models.ForeignKey(User) pref1 = models.ForeignKey(Dorm, related_name="pref1",verbose_name=u"Preference 1",null=True) ... friend1 = models.Cha

我已经创建了一个包含性别信息的个人资料模型。还有一种称为Dorm and Registration(不用于用户注册)的模型,如下所示:

class Registration(models.Model):
user = models.ForeignKey(User)
pref1 = models.ForeignKey(Dorm, related_name="pref1",verbose_name=u"Preference 1",null=True)
...
friend1 = models.CharField(u"Friend 1", max_length=15,blank=True)

class Dorm(models.Model):
name = models.ForeignKey(Building)
gender = models.CharField(u"Gender", max_length=1, blank=True, choices=GENDER_CHOICES)
class RegistrationForm(forms.ModelForm):
dorms = Dorm.objects.filter(gender='M')
pref1 = forms.ModelChoiceField(queryset=dorms, empty_label=None)
...
class Meta:
    model = Registration
    exclude = ('user')
现在,我尝试使用forms.ModelForm为该注册模型生成一个表单,如下所示:

class Registration(models.Model):
user = models.ForeignKey(User)
pref1 = models.ForeignKey(Dorm, related_name="pref1",verbose_name=u"Preference 1",null=True)
...
friend1 = models.CharField(u"Friend 1", max_length=15,blank=True)

class Dorm(models.Model):
name = models.ForeignKey(Building)
gender = models.CharField(u"Gender", max_length=1, blank=True, choices=GENDER_CHOICES)
class RegistrationForm(forms.ModelForm):
dorms = Dorm.objects.filter(gender='M')
pref1 = forms.ModelChoiceField(queryset=dorms, empty_label=None)
...
class Meta:
    model = Registration
    exclude = ('user')
正如您在第二行中看到的,我使用硬编码的性别值M查询宿舍。我需要获取用户的性别,并使用该性别信息查询数据库,而不是硬编码的值


我一直在搜索文档,但什么也找不到。你能帮助我吗?如何在Django表单中了解登录用户的个人资料信息?

詹姆斯·贝内特写了一篇博文,该博文应能完美地解释您需要什么:

詹姆斯·贝内特写了一篇博文,该博文应能完美地解释您需要什么:

因此,无需对“表单工厂”的init函数进行某种蒙骗操作这可能是最好的办法

def RegFormFactory(user)

    dorms = Form.objects.filter(gender = "user.gender")
    class _RegistrationForm(forms.ModelForm):
        pref1 = forms.ModelChoiceField(queryset = dorms, empty_label=None)
        class Meta:
            model = Registration
            exclude = ('user')

    return _RegistrationForm
然后使用:

formclass = RegFormFactory(user)
form_inst = formclass()
...
form_inst = formclass(request.POST)

这在这里的一篇博文中有很好的描述:。

因此,如果不使用某种形式的init函数,“表单工厂”可能是最好的方法

def RegFormFactory(user)

    dorms = Form.objects.filter(gender = "user.gender")
    class _RegistrationForm(forms.ModelForm):
        pref1 = forms.ModelChoiceField(queryset = dorms, empty_label=None)
        class Meta:
            model = Registration
            exclude = ('user')

    return _RegistrationForm
然后使用:

formclass = RegFormFactory(user)
form_inst = formclass()
...
form_inst = formclass(request.POST)
这里的一篇博文对此进行了很好的描述:。

显然,用您从用户获取性别的任何方法替换“user.gender”,显然,用您从用户获取性别的任何方法替换“user.gender”