Стайлинг много ко многим поле в форме - PullRequest
0 голосов
/ 19 апреля 2019

Я создал форму на основе этой модели:

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

Первое: Имена - я хочу назвать эти треки с помощью (трек - модель и имеет поле "название") трек.заглавие.Как мне это сделать?Я ничего не нашел, когда искал виджеты во ManyToManyField.

Второе: выбор - например, когда я нажимаю на объект Track (1), когда выбран объект Track (4), obj (4)становится невыбранным, и obj (1) становится выбранным.Использование shift позволяет выбирать поля между объектами (например, между obj (1) и obj (3)), но пользователь не может выбрать obj (1) и obj (3), например.

1 Ответ

2 голосов
/ 19 апреля 2019

Для наименования треков вам необходимо определить __str__() для вашей модели трека.

class Track(models.Model):
    ...

    def __str__(self):
        return self.title

Чтобы выбрать несколько непоследовательных опций, используйте клавишу команды / управления вместо 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,
        }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...