1

I will provide all the details necessary to this issue.

Issue description:

  • I store some input fields with the Django forms (i.e. FormPredmet)
  • After that I save the form in a model called > Predmet
  • When pulling the data I have an issue that I didn't have with ModelForm
  • When printing or displaying (on the page) the Predmet.predavacIme object I get:

<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" />

Instead I just wanted a single value of each of these:

Desired output: Elvir,Elvir, Dzenan, Petko

Summary:

  • I get data using FormPredmet(forms.Form) this is I think the issue
  • then save the data to the Model Predmet
  • I try getting any obj for instance: myobj = Predmet.objects.get(pk=1)
  • after printing one of it's fields print(myobj.imePredavaca())
  • Instead of a value like "Elvir" I get HTML..input.. (did I store html?)

Modelsmodels.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 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 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()
2
  • Have you looked at Django template docs and used the {{}} notation or looked at the __str__() method for customizing how you want your object to be printed? Commented Jun 14, 2018 at 14:07
  • @dfundako Yes, but that would be if I call the whole object (i.e. predmet) I just want one field for instance {{predmet.predavacIme}} and to get "Elvir" Commented Jun 14, 2018 at 14:09

1 Answer 1

1

You have to clean form data before you save it into the model. Form returns all data with HTML tags. You can check more in the docs. In your case you need to do something like this:

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()

Also I would recommend to move a save() method from your Form to your View - it is more readable to save models there, forms only process form data.

Sign up to request clarification or add additional context in comments.

3 Comments

This is the correct answer. Note: I did not clean the data when I used (forms.Form). Since I did not have to do that with (forms.FormModels).
@Elvir Muslic You did not show the code where you use your Razred form, so I cant say why you have not to clean data there. Also read this answer - stackoverflow.com/a/5926420/8495108 for more info about cleaned_data method.
Yeah, but that's what it was. I couldn't use ModelsForm for this one... Thank you!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.