Невозможно добавить значения из форм в модели Django - PullRequest
1 голос
/ 29 марта 2020

Я сделал форму, и там у меня было поле с несколькими вариантами выбора, называемое исполнителями, которое я получил из своей базы данных, и при добавлении песни пользователь может выбрать нескольких исполнителей и сохранить песню.

Художники - это ManyToManyField в Django моделях.

models.py

class Artists(models.Model):
    """ Fields for storing Artists Data """
    artist_name = models.CharField(max_length = 50, blank = False)
    dob = models.DateField()
    bio = models.TextField(max_length = 150)

    def __str__(self):
        return self.artist_name

class Songs(models.Model):
    """ Fields for storing song data """
    song_name = models.CharField(max_length = 30, blank = False)        
    genre = models.CharField(max_length = 30, blank = False)
    artist = models.ManyToManyField(Artists)
    release_date = models.DateField()

forms.py

class Song_input(forms.Form):
    queryset = Artists.objects.only('artist_name')
    OPTIONS = []
    for i in queryset:
        s = []
        s = [i, i]
        OPTIONS.append(s)

    artist_name = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple,choices=OPTIONS)
    song_name = forms.CharField()       
    genre = forms.CharField()
    release_date = forms.DateField(widget=DateInput)

Теперь я хочу получить все значения, выбранные в форме, и сохранить их в моей базе данных. Здесь artist_name может иметь несколько значений.

Я пытался использовать методы add () и create (), но не могу понять, как добавить все данные, где одно поле (artist_name), имеющее несколько данных, в мою базу данных .

1 Ответ

0 голосов
/ 29 марта 2020

Я настоятельно советую использовать ModelForm [Django -doc] . Тем более, что вы используете ManyToManyField s, которые более громоздки для экономии.

# app/forms.py

from django import forms

class SongForm(forms.<b>ModelForm</b>):
    class Meta:
        model = Songs
        fields = '__all__'
        widgets = {
            'artist': forms.CheckboxSelectMultiple,
            'release_date': forms.DateInput
        }

Таким образом, нет необходимости указывать поля самостоятельно, вы можете изменить виджеты, добавив их в widgets словарь [Django -doc] из подкласса Meta.

По вашему мнению, вы можете как визуализировать, так и сохранять объекты с этой формой :

# app/views.py

from app.forms import SongForm

def add_song(request):
    if request.method == 'POST':
        form = SongForm(request.POST, request.FILES)
        if form.is_valid():
            <b>form.save()</b>
            return redirect(<i>'name-of-some-view'</i>)
    else:
        form = SongForm()
    return render(request, <i>'some-template.html'</i>, {'form': form})

form.save() сохранит объект в базе данных.

В шаблоне вы можете затем отобразить шаблон:

<form method="post" action="{% url <i>'name-of-add_song-view'</i> %}">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...