【问题标题】:Can not add values from forms to Django models无法将表单中的值添加到 Django 模型
【发布时间】:2023-03-15 18:43:01
【问题描述】:

我制作了一个表单,其中有一个名为艺术家的多项选择字段,我从我的数据库中获取了该字段,在添加歌曲时,用户可以选择多个艺术家并保存歌曲。

艺术家是 Django 模型中的 ManyToManyField。

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) 具有多个数据的所有数据添加到我的数据库中。

【问题讨论】:

  • 请使用ModelForm
  • 谢谢我现在使用它,但我可以将我的自定义小部件与 ModelForm 一起使用吗?
  • 可以,在answer中指定,您可以在Meta中指定widgets

标签: django database forms model


【解决方案1】:

我强烈建议使用ModelForm [Django-doc]。尤其是你使用ManyToManyFields,更麻烦的是自救。

# app/forms.py

from django import forms

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

因此无需自己指定字段,您可以通过将这些添加到Meta 子类的widgets dictionary [Django-doc] 来更改小部件。

在您看来,您可以使用该表单渲染和 sae 对象:

# 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():
            form.save()
            return redirect('name-of-some-view')
    else:
        form = SongForm()
    return render(request, 'some-template.html', {'form': form})

form.save() 会将对象保存在数据库中。

在模板中,然后可以渲染模板:

<form method="post" action="{% url 'name-of-add_song-view' %}">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>

【讨论】:

  • @SubhamBanerjee:啊,但那是因为该字段被命名为artist,而不是artist_name
  • 是的,艺术家工作,但我希望日期字段作为日历我也尝试过 class DateInput(forms.DateInput): input_type = 'date'
  • @SubhamBanerjee:您是否将'release_date': forms.DateInput 替换为'release_date': DateInput
  • @SubhamBanerjee:但你仍然指的是 old form.DateInput。如果你是子类,你当然应该参考新的类。
  • @SubhamBanerjee: aargghh...我打错字了(被复制了),是release_date,而不是release_data
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 2020-02-29
  • 2012-10-29
  • 2011-10-13
  • 2016-06-02
  • 1970-01-01
相关资源
最近更新 更多