Django - 表单值ERROR [简单?]

时间:2018-06-14 13:59:14

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

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

问题描述:

  • 我使用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" />

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

所需的输出:ElvirElvirDzenanPetko

要点:

  • 我使用FormPredmet(forms.Form)获取数据这是我认为的问题
  • 然后将数据保存到Model Predmet
  • 我尝试获取任何obj例如:myobj = Predmet.objects.get(pk = 1)
  • 打印其中一个字段后打印(myobj.imePredavaca())
  • 而不是类似于&#34; Elvir&#34;我得到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 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()

1 个答案:

答案 0 :(得分: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 - 在那里保存模型更具可读性,表单只处理表单数据。