【问题标题】:Django - Form value ERROR [Simple?]Django - 表单值错误 [简单?]
【发布时间】:2018-11-24 08:07:54
【问题描述】:

我将提供此问题所需的所有详细信息。

问题描述:

  • 我用 Django 表单存储了一些输入字段(即FormPredmet
  • 之后,我将表单保存在一个名为 > Predmet 的模型中
  • 提取数据时,我遇到了 ModelForm 没有的问题
  • 打印或显示(在页面上) Predmet.predavacIme 对象时,我得到:

<input type="text" name="Ime_Predavaca" value="Elvir" maxlength="50" required id="id_Ime_Predavaca" /> <input type="text" name="Ime_Predavaca" value="Elvir" maxlength="50" required id="id_Ime_Predavaca" /> <input type="text" name="Ime_Predavaca" value="Dzenan" maxlength="50" required id="id_Ime_Predavaca" /> <input type="text" name="Ime_Predavaca" value="Petko" maxlength="50" required id="id_Ime_Predavaca" />

相反,我只想要这些中的每一个的单个值:

所需输出:Elvir,Elvir,Dzenan,Petko

总结:

  • 我使用 FormPredmet(forms.Form) 获取数据,这是我认为的问题
  • 然后将数据保存到 Model Predmet 中
  • 我尝试获取任何 obj,例如:myobj = Predmet.objects.get(pk=1)
  • 在打印其中一个字段后 print(myobj.imePredavaca())
  • 我得到的不是像“Elvir”这样的值,而是 HTML..input..(我存储了 html 吗?)

型号models.py

class ModelRazred(models.Model):
    godina = models.PositiveSmallIntegerField()
    brojRazreda = models.PositiveSmallIntegerField()
    ime = models.CharField(max_length=50)
    prezime = models.CharField(max_length=50)


class Predmet(models.Model):
    predavacIme = models.CharField(max_length=50)
    predavacPrezime = models.CharField(max_length=50)
    imePredmeta = models.CharField(max_length=50)
    razred = models.ForeignKey(ModelRazred, on_delete=models.CASCADE)

网址urls.py

"""urlconf for the base application"""


from django.urls import path

from .views import *


urlpatterns = [
    #Base
    path('', home, name='home'),





    # Stranice
    path('dodajrazred/', dodajrazred, name='dodajrazred'),

    path('predmeti/<int:razred_id>/', predmetisubmit, name='predmetisubmit'),
    path('razred/<int:razred_id>/', detail, name='detail'),

    path('predmetisubmit/<int:razred_id>/', predmetisubmit, name='predmetisubmit'),




    # Metode
    path('predmet_submit/<int:razred_id>/', predmet_submit, name='predmet_submit'),


]

观看次数views.py

    def detail(request, razred_id):

    # Funkcija vraca detalje o odredjenom razredu
    # i njegove ucenike?

    form = FormPredmet()
    detaljiRazreda = ModelRazred.objects.get(pk=razred_id)
    form.razred = detaljiRazreda

    predmeti = Predmet.objects.filter(razred__id = razred_id)
    # svi predmeti tog odredjenog razreda 

    data = {
        'form': form,
        'predmeti':predmeti,
        'razred_id': detaljiRazreda.id,
        'ime' : detaljiRazreda.ime,
        'prezime': detaljiRazreda.prezime
    }

表格forms.py

from django import forms
from .models import ModelRazred, Predmet


class Razred(forms.ModelForm):
    godina = forms.IntegerField()
    brojRazreda = forms.IntegerField()
    ime = forms.CharField(max_length=50)
    prezime = forms.CharField(max_length=50)

    class Meta:
        model = ModelRazred
        fields = ('godina', 'brojRazreda', 'ime', 'prezime')


class FormPredmet(forms.Form):
    Ime_Predavaca = forms.CharField(max_length=50)
    Prezime_Predavaca = forms.CharField(max_length=50)
    Ime_Predmeta = forms.CharField(max_length=50)

    class Meta:
        model = Predmet
        fields = ('Ime_Predavaca', 'Prezime_Predavaca',
                  'Ime_Predmeta', 'razred')

    def save(self, razredID):

        razredPredmeta =  ModelRazred.objects.get(pk=razredID)
        myModel = Predmet(predavacIme=self['Ime_Predavaca'],
                          predavacPrezime=self['Prezime_Predavaca'], 
                          imePredmeta=self['Ime_Predmeta'], razred=razredPredmeta)
        myModel.save()

【问题讨论】:

  • 您是否查看过 Django 模板文档并使用 {{}} 表示法或查看过 __str__() 方法来自定义您希望如何打印对象?
  • @dfundako 是的,但是如果我调用整个对象(即 predmet)我只想要一个字段,例如 {{predmet.predavacIme}} 并获得“Elvir”

标签: python django django-models django-forms django-views


【解决方案1】:

在将表单数据保存到模型之前,您必须对其进行清理。表单返回所有带有 HTML 标记的数据。您可以在docs 中查看更多信息。在您的情况下,您需要执行以下操作:

def save(self, razredID):

        razredPredmeta =  ModelRazred.objects.get(pk=razredID)
        myModel = Predmet(predavacIme=self.cleaned_data['Ime_Predavaca'],
                          predavacPrezime=self.cleaned_data['Prezime_Predavaca'], 
                          imePredmeta=self.cleaned_data['Ime_Predmeta'], razred=razredPredmeta)
        myModel.save()

我还建议将save() 方法从您的Form 移动到您的View - 在那里保存模型更具可读性,表单只处理表单数据。

【讨论】:

  • 这是正确答案。注意:我使用(forms.Form)时没有清理数据。因为我不必使用 (forms.FormModels)。
  • @Elvir Muslic 您没有在使用Razred 表单的位置显示代码,所以我不能说为什么您不必在此处清理数据。另请阅读此答案 - stackoverflow.com/a/5926420/8495108 了解有关 cleaned_data 方法的更多信息。
  • 是的,但就是这样。我不能用 ModelsForm 这个...谢谢!
猜你喜欢
  • 2013-11-28
  • 2011-01-24
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
  • 2014-01-19
  • 2013-01-04
  • 2012-09-13
  • 1970-01-01
相关资源
最近更新 更多