如何从此ModelForm中删除密钥

时间:2011-07-18 00:25:05

标签: django django-templates django-forms

我有以下ModelForm并且我得到了我想要的结果,但我无法弄清楚如何从结果中删除密钥。

形式:

class TicketActionsForm(ModelForm):
assign = forms.ModelChoiceField(queryset=Users.objects.values('user').filter(account=3), empty_label="  Select Admin  ")

查看退货声明:

return render_to_response('tickets/view.html',
    {'ticket':ticket,'ticketactions':TicketActionsForm()},
    context_instance=RequestContext(request)
)

模板:

{{ ticketactions.assign }}

结果:(截图:http://snapplr.com/z7t7

<option value="" selected="selected">  Select Admin  </option> 
<option value="{&#39;user&#39;: u&#39;Chris&#39;}">{&#39;user&#39;: u&#39;Chris&#39;}    </option> 
<option value="{&#39;user&#39;: u&#39;mmiller&#39;}">{&#39;user&#39;: u&#39;mmiller&#39;}</option> 
<option value="{&#39;user&#39;: u&#39;millerm&#39;}">{&#39;user&#39;: u&#39;millerm&#39;}</option> 
<option value="{&#39;user&#39;: u&#39;Cindy222&#39;}">{&#39;user&#39;: u&#39;Cindy222&#39;}</option> 

编辑:

我可以通过以下覆盖轻松更新标签,但我仍然偶然发现如何更改选项值。我可以在POST后修改数据,但我宁愿在此之前清理它。

class UserModelChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
    return obj['user']

分辨率:

我最后在 init 中做了一些黑客,以获得我想要的结果。

def __init__(self, *args, **kwargs):
    super(TicketActionsForm, self).__init__(*args, **kwargs)
    newChoices = []
    for item in self.fields['assign'].queryset:
        choice=(item['user'],item['user'])
        newChoices.append(choice)
    self.fields['assign'].choices = newChoices

1 个答案:

答案 0 :(得分:1)

This answer有一种简单的方法可以更改ModelChoiceField中使用的标签。

当您使用ModelChoiceField时,您可能想要调用Users.objects.all()而不是Users.objects.values('user')

您想要做的是拥有以下代码:

class UserModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.get_full_name()

当您制作表单时,您应该拥有以下代码:

class TicketActionsForm(ModelForm):
    assign = forms.ModelChoiceField(queryset=Users.objects.all().filter(account=3), empty_label="  Select Admin  ")

这样,一组(更准确地说,一个QuerySet)行被传递给ModelChoiceField对象,并且它可以访问所有字段。使用上面的代码,您可以控制标签,当您将objects.values('user').filter更改为objects.all().filter时,value标记的<option>属性将成为id的{​​{1}}排。然后,您可以使用idrequest.POST中的传入request.GET将其作为您喜欢的任何其他字段存储在数据库中,方法是运行查询。但是,在大多数情况下,您可能希望将其作为id存储在数据库中。