样式化多对多字段

时间:2019-04-19 14:07:06

标签: django forms

我基于此模型创建了表单:

class Playlist(models.Model):
    title = models.CharField(max_length=40, null=True)
    description = models.CharField(max_length=500, null=True)
    author = models.ForeignKey(User, default=None, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    miniature = models.ImageField(upload_to='images/playlist', default="defaults/default.png", validators=[validate_miniature_file_extension])
    tracks = models.ManyToManyField(Track)

表格:

class AddPlaylist(forms.ModelForm):
    class Meta:
        model = models.Playlist
        fields = ['title', 'description', 'tracks', 'miniature']
        widgets = {
            'description': Textarea(attrs={'cols': 30, 'rows': 10}),
        }

当我渲染它时,“曲目”的行为使我感到惊讶。看起来像这样:

enter image description here

第一件事:名称-我想用(Track是模型并且具有字段“ title”)Track.title来命名这些轨道。我该怎么做?在搜索ManyToManyField的小部件时,我什么也没找到。

第二件事:选择-例如,当我在选择Track对象(4)时单击Track对象(1)时,obj(4)被取消选中,而obj(1)被选中。使用shift可以选择对象之间的字段(例如obj(1)和obj(3)之间),但是用户不能选择obj(1)和obj(3)。

1 个答案:

答案 0 :(得分:1)

要命名轨道,您需要在Track模型上定义__str__()

class Track(models.Model):
    ...

    def __str__(self):
        return self.title

要选择多个非连续选项,请使用Command / Control键而不是shift键。或者,您可以使用CheckboxSelectMultiple小部件来显示复选框。

from django import forms


class AddPlaylist(forms.ModelForm):

    class Meta:
        model = models.Playlist
        fields = ['title', 'description', 'tracks', 'miniature']
        widgets = {
            'description': forms.Textarea(attrs={'cols': 30, 'rows': 10}),
            'tracks': forms.CheckboxSelectMultiple,
        }