Django - Form value ERROR [Simple?] - python

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

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.

Related

ModelFormset in Django CreateView

I'm still new to Django & I would like to know how can allow user to add more than 1 ReferrerMember on Registration form as I wanted to achieve similar to the image url below
https://imgur.com/a/2HJug5G
I applied modelformset but so far it's giving me an error where "membership_id" violates not-null constraint the moment I submitted the form.
I've searched almost everywhere to find how to implement this properly especially on class-based view instead of function based view but still no luck. If possible please help me point out on any mistakes I did or any useful resources I can refer to
models.py
class RegisterMember(models.Model):
name = models.CharField(max_length=128)
email = models.EmailField()
class ReferrerMember(models.Model):
contact_name = models.CharField(max_length=100)
company_name = models.CharField(max_length=100)
membership = models.ForeignKey(RegisterMember, on_delete=models.CASCADE)
forms.py
class RegisterMemberForm(ModelForm):
class Meta:
model = RegisterMember
fields = ['name', 'email', ]
class ReferrerForm(ModelForm):
class Meta:
model = ReferrerMember
fields = ['contact_name ', 'company_name ', ]
ReferrerMemberFormset = modelformset_factory(ReferrerMember, form=RegisterMemberForm, fields=['contact_name ', 'company_name ', ], max_num=2, validate_max=True, extra=2)
views.py
class RegisterMemberView(CreateView):
form_class = RegisterMemberForm
template_name = 'register.html'
def post(self, request, *args, **kwargs):
member_formset = ReferrerMemberFormset (request.POST, queryset=ReferrerMember.objects.none())
if member_formset .is_valid():
return self.form_valid(member_formset )
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['member_formset'] = ReferrerMember(queryset=ReferrerMember.objects.none())
return context
register.html
<form method="post">
{% csrf_token %}
{{form.as_p}}
{{member_formset.as_p}}
<input type="submit">
</form>

Cannot assign : must be a instance Django foreign Key error

I have created a model and connected a foreign key with it, but when I save them I get an error Cannot assign "1": "SupplierBidModel.Load_ID" must be a "ShipperBoardModel" instance.
I am fairly new to Django, and even newer to Django interconnected models concept. Any idea why this is happening ?? I have no idea where to go from here as there are not many questions such as this on Google either.
My models.py
class ShipperBoardModel(models.Model):
# Manufaturer_ID
LoadID = models.AutoField(primary_key=True)
From = models.CharField(max_length=100,null=True)
To = models.CharField(max_length=100,null=True)
Type = models.CharField(max_length=100,null=True)
Length = models.CharField(max_length=100,null=True)
Weight = models.CharField(max_length=100,null=True)
Numberoftrucks = models.IntegerField(null=True)
MaterialType = models.CharField(null=True,max_length=100)
Loadingtime = models.DateTimeField(null=True)
# Loadkey = models.ForeignKey()
def _str_(self):
return self.Origin
#
class SupplierBidModel(models.Model):
BidID = models.AutoField(primary_key=True)
Load_ID = models.ForeignKey(ShipperBoardModel,on_delete=models.CASCADE,default=3)
Supplier_ID = models.ForeignKey(SupplierBoardModel,on_delete=models.CASCADE,default=3)
Bid_amount = models.IntegerField(null=True)
class Meta:
unique_together = ('Load_ID', 'Supplier_ID')
Views.py
def suppliertablefun (request): # function to display shipperboardmodel
data = ShipperBoardModel.objects.all()
if request.method == 'POST':
forminput = BiddingForm(request.POST)
if forminput.is_valid():
forminput.save()
forminput = BiddingForm(request.POST)
return render(request, 'supplierboard/board.html', locals(), {'forminput': forminput})
PS: I am trying to prefill my form as such:
<form action="" method="post">
{# <input type="hidden" value={{item.LoadID}} name="Load_ID" /> #}
<input type="hidden" value={{item.LoadID}} name="Load_ID" />
{{ forminput.Bid_amount }}
<input type="submit" class="btn btn-primary" value="Submit"/>
</form>
I am trying to pass the current LoadID in the LoadID by using value = {{item.LoadID}} which is running because there a for loop in the template as such :
{% for item in data %}
Forms.py
class BiddingForm(forms.ModelForm):
Bid_amount = forms.IntegerField()
Load_ID = forms.IntegerField(widget=forms.HiddenInput())
class Meta:
model = SupplierBidModel
exclude = ()
Ok so I just fixed that error by pass value={{LoadID}} instead of value={{item.LoadID}} and there is no error, but it is not saving anything to the database. What to do now ?
Somewhere in your code you are trying to assign a number (1) to SupplierBidModel.Load_ID, which is incorrect because you have the following in your SupplierBidModel:
Load_ID = models.ForeignKey(ShipperBoardModel,on_delete=models.CASCADE,default=3,related_name='load')
If you are creating the ShipperBidModel using a number to link the ShipperBoardModel then you need to get the corresponding object first, something along the lines of:
# ... you get load_id from the form
shipper_board = ShipperBoardModel.objects.get(pk=load_id)
# then you create the SupplierBidModel instance, adding the other fields that you want
SupplierBidModel.objects.create(LoadId=shipper_board)
Your LoadId is not an id, is an ShipperBoardModel object, so you need to assign the corresponding one.
Your naming convention is all over the place, model fields should be lowercase separated by underscores. Check the docs: Model style
well you have some problem in the model
class SupplierBidModel(models.Model):
BidID = models.AutoField(primary_key=True)
Load_ID = models.ForeignKey(ShipperBoardModel,on_delete=models.CASCADE,default=3,related_name='load')
Supplier_ID = models.ForeignKey(SupplierBoardModel,on_delete=models.CASCADE,default=3,related_name='supplier')
Bid_amount = models.IntegerField(null=True)
you cannot have more than one in a single model. for that you need related_name parameter

Querying MYSQL with Django framework in HTML

I am building a site using Django framework with google api + MYSql. Currently I display all data entries' latitude and longitude from my dB onto a heatmap layer.
I need to be able to filter my data to refine what I am displaying. e.g - I would like to filter HazardInside.title by types such as "Slip" and "trip".
This filter will need to be able to filter by many other requirements simultaneously such as date and weather conditions. e.g title="Slip" + weather="Wet" + between dates of (dd/mm/yy - dd/mm/yy)
My current problem is successfully creating a view that requests new data from my dB and parses it to my HTML page.
models.py
class HazardInside(models.Model):
title = models.CharField(max_length=50)
description = models.CharField(max_length=250)
incident_date = models.DateField(auto_now=False)
lat = models.FloatField(max_length=25, default=0.00000)
lng = models.FloatField(max_length=25, default=0.00000)
room_number = models.CharField(max_length=25)
floor = models.CharField(max_length=10)
def __unicode__(self):
return self.title
class InjuryInside(models.Model):
title = models.CharField(max_length=50)
description = models.CharField(max_length=250)
incident_date = models.DateField(auto_now=False)
lat = models.FloatField(max_length=25, default=0.00000)
lng = models.FloatField(max_length=25, default=0.00000)
room_number = models.CharField(max_length=25)
floor = models.CharField(max_length=10)
def __unicode__(self):
return self.title
views.py
from django.shortcuts import render, HttpResponse
from qutheatmap.models import Markers, HazardInside, InjuryInside
from django.template import RequestContext
from django.shortcuts import render_to_response
def home(request):
marker = Markers.objects.all()
hazardinsides = HazardInside.objects.all()
injuryinsides = InjuryInside.objects.all()
mapdata = {
'markers': marker,
'hazardinsides': hazardinsides,
'injuryinsides': injuryinsides
}
return render(request, 'heatmap/map.html', mapdata)
def search(request):
query = request.GET.get('type')
try:
query = char(query)
except ValueError:
query = None
hazardinsides = None
if query:
hazardinsides = HazardInside.objects.get(title=query)
context = RequestContext(request)
mapdata = {
'markers': marker,
'hazardinsides': hazardinsides,
'injuryinsides': injuryinsides
}
return render_to_response('heatmap/map.html', {"hazardinsides": hazardinsides,}, context_instance=context)
within my html
<form method="get" action="http://localhost:8000/qutheatmap/">
Search:<input type="text" name="type" id="id_q" value="{{ query }}"/>
<input type="submit" value="Search" />
</form>
I have tried a few different methods with my limited Django knowledge to no avail such as:
Django form to query database (models)
Querying a django DB with model forms
EDIT:
URLs
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.home),
url(r'^$', views.search),
]
URLs config
from django.contrib import admin
from django.conf.urls import url, include
from qutheatmap import views
urlpatterns = [
url(r'qutheatmap/', include('qutheatmap.urls')),
]

Django: UpdateView and ModelForm

I'm having a weird issue when using a ModelForm as a form_class for UpdateView.
First of all: When using the UpdateView without the form_class tag, everything works perfectly. However, when I try to use the ModelForm (because I want to add a MarkdownField) I get <mediwiki.views.MediwikiForm object at 0x7f990dfce080>displayed in my browser window. Just in plain text?
#template/mediwiki/create2.html:
<form action="" method="post">{% csrf_token %}
{{ form }}
<input type="submit" value="Save" />
</form>
#views.py:
class EntryUpdate(UpdateView):
model = Mediwiki
slug_field = 'non_proprietary_name'
template_name = "mediwiki/create2.html"
form_class = MediwikiForm⋅
#fields = '__all__' #this works...
#forms.py
class MediwikiForm(ModelForm):
# wiki_page_markdown = MarkdownxFormField()
class Meta:
model = Mediwiki⋅
fields = ['non_proprietary_name', 'category', 'wiki_page_markdown']
#models.py
class Mediwiki(models.Model):
non_proprietary_name = models.CharField(max_length = 100, unique = True)
category = models.ManyToManyField(Category)
wiki_page = models.TextField(blank = True)
wiki_page_markdown = models.TextField(blank = True)
def save(self):
import markdown
self.wiki_page = markdown.markdown(self.wiki_page_markdown)
super(Mediwiki, self).save() # Call the "real" save() method.
def get_absolute_url(self): # For redirect after UpdateView
return reverse('entry', kwargs={'slug': self.non_proprietary_name})
def __str__(self):
return self.non_proprietary_name
#urls.py
url(r'^mediwiki/(?P<slug>\D+)/edit$', EntryUpdate.as_view(), name="update"),
Any idea what might cause this error? Any help will be much appreciated...

Pb initializing ModelForm

I am learning Django, and I have a problem with ModelForm. So I have an app which is named mini_url. In this app I have a model :
class MiniURL(models.Model):
url = models.URLField(unique=True)
code = models.CharField(unique=True, max_length=255)
date = models.DateTimeField(auto_now_add=True, auto_now=False, verbose_name='Date de création')
pseudo = models.CharField(max_length=30)
nb_acces = models.IntegerField(default=0)
I wanted to create a form based on my model, so I did this in a form.py file :
from django.forms import ModelForm
from mini_url.models import MiniURL
def MiniURLForm(ModelForm):
class Meta:
model = MiniURL
fields = ['url', 'pseudo']
And then in my view I have this :
from django.forms import ModelForm
from mini_url.models import MiniURL
def create_url(request):
if request.method == 'POST':
form = MiniURLForm(request.POST)
if form.is_valid():
new_url = MiniURL()
new_url.url = form.cleaned_data['url']
new_url.pseudo = form.cleaned_data['pseudo']
new_url.code = generer(5)
new_url.save()
else:
form = MiniURLForm()
return render(request, 'mini_url/create_url.html', {'form': form})
Finally my template (mini_url/create_url.html) which shows the form :
<p>
<form action="{% url "mini_url.views.create_url" %}" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit"/>
</form>
</p>
But when I try to acceed to the template I have this error :
MiniURLForm() missing 1 required positional argument: 'ModelForm'
And it shows me that the error is in my view at the line where there is :
form = MiniURLForm()
So I don't understand why it fails. I did what the doc says I think : https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/#topics-forms-modelforms
Anyone can help me ?
You have accidentally defined MiniURLForm as a function instead of a form class.
Change
def MiniURLForm(ModelForm): # wrong
to
class MiniURLForm(ModelForm): # should be a class
When you defined MiniURLForm as a function, Django expected a positional argument as per your definition. Change it to a form class and it should work correctly.
Final Code:
class MiniURLForm(ModelForm):
class Meta:
model = MiniURL
fields = ['url', 'pseudo']

Categories