django modelform使用normal字段表示关系

时间:2014-05-30 09:38:54

标签: django forms

我正在用这个模型构建一个小消息系统:

class Mail(models.Model):
    sender = models.ForeignKey(Character, related_name="+")
    to = models.ForeignKey(Character, related_name="+")             
    sent_at = models.DateTimeField(auto_now_add=True)
    subject = models.CharField(max_length=127)
    body = models.TextField()

现在我做了一个模型:

class ComposeForm(forms.ModelForm): 
    class Meta:
        model = Mail
        exclude = ["folder", "sender", "sent_at"]
然而,这给了我""字段包含所有可能字符的下拉列表。 我喜欢在普通的charfield(稍后使用自动完成)中进行此操作,而不是使用此下拉列表。 知道如何实现这个目标吗?

3 个答案:

答案 0 :(得分:1)

我已经在类似的地方,我根据需要找到了2个解决方案。第一个是让你开始使用像select2这样的东西并通过ajax获取查询:

class ComposeForm(forms.ModelForm): 
    to_char = forms.CharField(max_length=255, required=False)  # use the name you want
    class Meta:            
        model = Mail
        exclude = ["folder", "sender", "sent_at","to"]

因此to_char为空,然后您根据需要管理该字段,当您执行POST时,您将在视图中获得to_char的值,并分配给您所在的模型需要它。


我建议的其他选项是使用ModelChoiceField代替Charfield,如下所示:

class ComposeForm(forms.ModelForm): 
    to_char = forms.ModelMultipleChoiceField(queryset=Character.objects.all())
    class Meta:            
        model = Mail
        exclude = ["folder", "sender", "sent_at","to"]

这样可以更容易地将外部选择工具用作select2(不使用AJAX)


当模型有数千种可能的选择时,我选择第一个,因此选择没有加载所有选项,页面将很快。我在模板中使用了一个select2,在这个例子中to_char,它在AJAX视图中加载选项

当有数百个选择时使用第二个选项并且使用select2的自动完成功能在此字段上没有任何问题,我认为如果您没有太多选择,这将是最适合您的,{ {1}},您可以毫无困难地附加自动填充

答案 1 :(得分:1)

我可能已经找到了解决这个问题的更简洁的解决方案。通过以这种方式覆盖默认表单字段:

class ComposeForm(forms.ModelForm): 
    class Meta:
        model = Mail
        exclude = ["folder", "sender", "sent_at"]
        widgets = {'to': forms.TextInput()}

答案 2 :(得分:-1)

1)如果您不想显示所有值,那么您需要做的就是覆盖到字段查询集。

像:

class ComposeForm(forms.ModelForm): 
    class Meta:
        model = Mail
        exclude = ["folder", "sender", "sent_at"]

    def __init__(self, *args, **kwargs):
        super(ComposeForm, self).__init__(*args, **kwargs)
        self.fields['to'].queryset = Character.objects.none()

2)如果要添加自动完成功能,则需要具有过滤功能的视图并返回已过滤的选项。你还需要一些js小部件。有很多可用的。在django一侧,你只需要更新字段小部件参数,这样你的js就可以拿起这个字段。