2011-09-05 128 views
2

我使用inlineformset_factory为客户和会话之间的多对多关系创建字段,并使用中间人出席模型。Django - 将参数传递给内嵌套件

我有我的看法如下文件:

AttendanceFormset = inlineformset_factory(
    Session, 
    Attendance, 
    formset=BaseAttendanceFormSet, 
    exclude=('user'), 
    extra=1, 
    max_num=10, 
    ) 

session = Session(user=request.user) 
formset = AttendanceFormset(request.POST, instance=session) 

而且,我需要重写表单域的一个,我添加了下面的表单集基类:

class BaseAttendanceFormSet(BaseFormSet): 

    def add_fields(self, form, index): 
     super(BaseAttendanceFormSet, self).add_fields(form, index) 
     form.fields['client'] = forms.ModelChoiceField(
       queryset=Client.objects.filter(user=2)) 

现在,表单工作正常,但我需要传递一个值到formset中,以便我可以过滤基于当前用户显示的客户端,而不仅仅使用ID 2.

任何人都可以 帮帮我?

任何意见赞赏。

谢谢。

编辑

对于任何阅读,这是对我工作:

def get_field_qs(field, **kwargs): 
     if field.name == 'client': 
      return forms.ModelChoiceField(queryset=Client.objects.filter(user=request.user)) 
     return field.formfield(**kwargs) 

回答

6

如何利用inlineformset_factory的formfield_callback PARAM,而不是提供一个formset?提供一个可调用的函数,返回应该在表单中使用的字段。

表单字段回调的第一个参数是字段,而** kwargs是可选参数(例如:widget)。

例如(使用request.user的过滤器,如果需要用另一个替换。

def my_view(request): 
    #some setup code here 

    def get_field_qs(field, **kwargs): 
     formfield = field.formfield(**kwargs) 
     if field.name == 'client': 
      formfield.queryset = formfield.queryset.filter(user=request.user) 
     return formfield 

    AttendanceFormset = inlineformset_factory(
     ... 
     formfield_callback=get_field_qs 
     ... 
    ) 

    formset = AttendanceFormset(request.POST, instance=session) 

为了更好地理解它,看到的formfield_callback in Django's FormSet code使用

+0

您好,感谢您的回复。我尝试添加上面的内容(尽管我必须返回field.formfield(** kwargs)而不是字段),但它现在返回所有客户端对象。我已经在django工具栏中读取了查询并且过滤器没有被应用,我试图从if语句内输出到控制台,所以我知道我被击中。任何想法为什么它可能会忽略它?再次感谢。 – Dan

+0

你可以用第二次尝试更新你的问题吗?猜你还可以返回forms.ModelChoiceField(queryset = Client.objects.filter(user = request.user))如果该字段被命名为客户端 – mkriheli

+0

谢谢,现在工作:) – Dan