这是我在使用Django crispy form时遇到的一个问题。
下面是模型字段(只显示必要的代码)"
class Product(models.Model):
name=models.CharField(max_length =200)
unit = models.ForeignKey(Unit,related_name='product_master_master_unit')
manufacturer=models.ForeignKey(Manufacturer,related_name='product_master_master_manufacturer')
tenant=models.ForeignKey(Tenant,related_name='product_master_user_tenant')
objects = TenantManager()
现在,这是我的形式,我用之前使用脆的形式。我必须只查询那些特定于当前租户的字段。这是按照以下步骤完成的:
class ProductForm(forms.ModelForm):
def __init__(self,*args,**kwargs):
self.tenant=kwargs.pop('tenant',None)
super (ProductForm,self ).__init__(*args,**kwargs) # populates the post
self.fields['unit'].queryset = Unit.objects.for_tenant(self.tenant).all()
self.fields['manufacturer'].queryset = Manufacturer.objects.for_tenant(self.tenant).all()
class Meta:
model=Product
exclude =('slug', 'tenant')
如果我不使用酥脆的形式,这个工作很好。然而,在使用脆形式时,我得到的错误是,与Unit和Manufacturer(正在查询特定租户)相关的外键字段在脆形式中没有显示任何选项。有什么方法可以用脆皮的形式表现出来吗,或者我必须完全放弃这种脆皮的形式?
只是为了帮助你,我在我的表单中做了一个人可以用django的"ForeignKey"做的事情。Limit_choices_to ",如果它允许动态选择的话。
用下面的东西解决了这个问题。
通常,我们用以下代码调用form:from .forms import Formname
form=Formname()
现在,如果我这样做,不知怎么的,crispyform中的init构造函数不会获得当前请求数据。
但是,如果使用以下代码,则crispyform将获取用户数据:
from .forms import Formname
form=Formname(request.user.whatever_you_need)
此详细答案供将来参考。希望这能帮到你。