Formset object has no attribute 'absolute_max' - django

I want to create bills in my app. I have one extra_bill_form and multible item_forms.
view:
def ExtraBillView(request):
item_form_set = formset_factory(ItemForm, formset=BaseItemFormSet, can_delete=True)
extra_bill_form = ExtraBillForm()
if request.method == 'POST':
item_form_set = BaseItemFormSet(request.POST)
extra_bill_form = ExtraBillForm(request.POST)
if extra_bill_form.is_valid() and item_form_set.is_valid():
al1 = extra_bill_form.cleaned_data.get('adress_line1')
al2 = extra_bill_form.cleaned_data.get('adress_line2')
al3 = extra_bill_form.cleaned_data.get('adress_line3')
al4 = extra_bill_form.cleaned_data.get('adress_line4')
for form in item_form_set:
pass
pdb.set_trace()
else:
extra_bill_form = ExtraBillForm()
item_form_set = formset_factory(ItemForm, formset=BaseItemFormSet, extra=0, max_num=5, min_num=1)
context = {
'extra_bill_form': extra_bill_form,
'item_form_set': item_form_set,
}
return render(request, 'extra_bill.html', context)
form:
class ExtraBillForm(forms.Form):
adress_line1 = forms.CharField(label='Adresszeile 1:', required=True)
adress_line2 = forms.CharField(label='Adresszeile 2:', required=False)
adress_line3 = forms.CharField(label='Adresszeile 3:', required=False)
adress_line4 = forms.CharField(label='Adresszeile 4:', required=False)
class ItemForm(forms.Form):
name = forms.CharField(label='Artikelname:')
ust = forms.IntegerField(label='UST:', initial=20)
price_nto = forms.IntegerField(label='Preis netto:', required=False)
price_brt = forms.IntegerField(label='Preis brutto:', required=False)
class BaseItemFormSet(BaseFormSet):
def clean(self):
if self.price_nto is None:
if self.price_brt is None:
return
if any(self.errors):
return
If I submitt my forms, I get an error:
'BaseItemFormSet' object has no attribute 'absolute_max'
how to solve this problem?
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/calculator/extrabill/
Django Version: 1.9.4
Python Version: 3.5.1
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django_ajax',
'django_bootstrap_dynamic_formsets',
'Bank',
'bootstrap3',
'Building',
'Calculator',
'CounterChange',
'Customer',
'Credit',
'Hackgut',
'Heatingplant',
'Index',
'jquery',
'jquery_ui',
'Measurement',
'Price',
'Rate']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "/usr/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response
149. response = self.process_exception_by_middleware(e, request)
File "/usr/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response
147. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/klaus/PycharmProjects/waerme/Calculator/views.py" in ExtraBillView
94. if extra_bill_form.is_valid() and item_form_set.is_valid():
File "/usr/lib/python3.5/site-packages/django/forms/formsets.py" in is_valid
316. self.errors
File "/usr/lib/python3.5/site-packages/django/forms/formsets.py" in errors
290. self.full_clean()
File "/usr/lib/python3.5/site-packages/django/forms/formsets.py" in full_clean
337. for i in range(0, self.total_form_count()):
File "/usr/lib/python3.5/site-packages/django/forms/formsets.py" in total_form_count
116. return min(self.management_form.cleaned_data[TOTAL_FORM_COUNT], self.absolute_max)
Exception Type: AttributeError at /calculator/extrabill/
Exception Value: 'BaseItemFormSet' object has no attribute 'absolute_max'

The formset factory creates the formset class. You should only call formset_factory once. You can do this outside of the view.
ItemFormSet = formset_factory(ItemForm, formset=BaseItemFormSet, extra=0, max_num=5, min_num=1)
Then, in your view, instantiate the ItemFormSet that was created by formset_factory. You shouldn't instantiate BaseItemFormSet.
if request.method == 'POST':
item_form_set = ItemFormSet(request.POST)
...
else:
item_form_set = ItemFormSet() # blank formset for GET request
context = {
'extra_bill_form': extra_bill_form,
'item_form_set': item_form_set,
}
return render(request, 'extra_bill.html', context)

Related

Django SingleObjectMixin

I try to create simple SingleObjectMixin class, later i will use it with render_json_response() for providing AJAX data streaming. The main goal is basket for online store. So there is simple test class:
class Test(SingleObjectMixin):
model = GoodsDescription
slug_url_kwarg = 'test_id'
slug_field = 'artikul' # pk field in 'GoodsDescription' table
def get(self, request, *args, **kwargs):
self.object = self.get_object()
return render(request, 'temp_code.html', {'msg':self.object.name})
So the mistake is:
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/admin/test%3D5/
Django Version: 1.10.5
Python Version: 2.7.12
Installed Applications:
['alexbase',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'easy_thumbnails']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "/home/user/.local/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner
39. response = get_response(request)
File "/home/user/.local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "/home/user/.local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/user/.local/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
23. return view_func(request, *args, **kwargs)
Exception Type: TypeError at /admin/test=5/
Exception Value: object() takes no parameters
SingleObjectMixin is, well, a mixin. It's not a full view you can inherit from. You should use DetailView instead.
URL conf string should be right:
url(r'^(?:test=(?P<test_id>\d+))/$', login_required(views.TestAJAXView), name='temp_code'),
Finally, i want to use class like this:
class TestAJAXView(JSONResponseMixin, SingleObjectMixin):
model = GoodsDescription
slug_url_kwarg = 'test_id'
slug_field = 'artikul'
json_dumps_kwargs = {"indent": 2}
def get(self, request, *args, **kwargs):
self.object = self.get_object()
context_dict = {
"category": self.object.category,
"name": self.object.name
}
return self.render_json_response(context_dict)
But exception was raised, so i tried this:
class Test(SingleObjectMixin):
model = GoodsDescription
slug_url_kwarg = 'test_id'
slug_field = 'artikul' # pk field in 'GoodsDescription' table
def get(self, request, *args, **kwargs):
self.object = self.get_object()
return render(request, 'temp_code.html', {'msg':self.object.name})

Django 1.10 / AttributeError: 'list' object has no attribute '_meta'

I got this error:
Internal Server Error: /QOP/1/editar/
Traceback (most recent call last):
...
opts = instance._meta
AttributeError: 'list' object has no attribute '_meta'
[25/Nov/2016 19:17:00] "GET /QOP/1/editar/ HTTP/1.1" 500 77572
models.py
from django.db import models
from smart_selects.db_fields import ChainedForeignKey
from django.core.urlresolvers import reverse
from modulos.modPessoas.models import Postos
# Quadro Orgânico Pessoal
class Qop(models.Model):
class Meta:
ordering = ['qop_ref']
verbose_name = 'Quadro Orgânico Pessoal'
verbose_name_plural = 'Quadro Orgânico Pessoal'
qop_ref = models.CharField(max_length=255, null=True, blank=True, verbose_name='Referência')
qop_nome = models.CharField(max_length=255, null=True, blank=True, verbose_name='QOP Nome')
qop_dt_arov = models.DateField(null=True, blank=True, verbose_name='Data de Aprovação')
qop_atv = models.BooleanField(default=True, verbose_name='Ativo?')
def __str__(self):
return '{} {}'.format(self.qop_ref, self.qop_nome)
def get_absulute_url(self):
return reverse("QOP:detalhe", kwargs={"pk": self.id})
views.py
def qop_editar(request, pk=None):
instance = get_list_or_404(Qop, id=pk)
form = QopForm(request.POST or None, request.FILES or None, instance=instance)
if form.is_valid():
instance = form.save(commit=False)
instance.save()
contexto = {
"titulo": "QOP Editar",
"instance": instance,
"form": form
}
return render(request, "modQOP/editar.html", contexto)
urls.py
from django.conf.urls import url
from .views import (index,
qop_lista,
qop_detalhe,
qop_criar,
qop_editar)
urlpatterns = [
url(r'^$', index),
url(r'^criar/$', qop_criar),
url(r'^lista/$', qop_lista),
url(r'^(?P<pk>\d+)/detalhe/$', qop_detalhe, name='detalhe'),
url(r'^(?P<pk>\d+)/editar/$', qop_editar, name='editar'),
]
template
<form method="post" action="" enctype="multipart/form-data">
{% csrf_token %}
Nome: {{ form.qop_nome }}<br>
Nº de Referência: {{ form.qop_ref }}<br>
Data de Aprovação: {{ form.qop_dt_arov }}<br>
Ativo? {{ form.qop_atv }}<br>
<button type="submit" class="button">Guardar</button>
</form>
What is wrong with code?
Thanks in advance!
edit:
Full traceback:
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/QOP/1/editar/
Django Version: 1.10.3
Python Version: 3.5.2
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'smart_selects',
'modulos.modAutenticacao',
'modulos.modQOP',
'modulos.modPessoas']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "C:\Users\Filipe\envRTm\lib\site-packages\django\core\handlers\exception.py" in inner
39. response = get_response(request)
File "C:\Users\Filipe\envRTm\lib\site-packages\django\core\handlers\base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "C:\Users\Filipe\envRTm\lib\site-packages\django\core\handlers\base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\Filipe\Documents\GitHub\rhead\modulos\modQOP\views.py" in qop_editar
36. form = QopForm(request.POST or None, request.FILES or None, instance=instance)
File "C:\Users\Filipe\envRTm\lib\site-packages\django\forms\models.py" in __init__
282. object_data = model_to_dict(instance, opts.fields, opts.exclude)
File "C:\Users\Filipe\envRTm\lib\site-packages\django\forms\models.py" in model_to_dict
87. opts = instance._meta
Exception Type: AttributeError at /QOP/1/editar/
Exception Value: 'list' object has no attribute '_meta'
You can't pass the result from get_list_or_404 to a ModelForm instance as it will return an QuerySet. You need to use get_object_or_404 to return an instance of the model.

Django inlineformset_factory rendering throwing error

I am trying to build a view with 2 models using inlinefactory.
Models.py
class serviceinvoice(models.Model):
user=models.ForeignKey(User,related_name='invoice')
invoice_number=models.PositiveIntegerField()
#invoice_no = models.CharField(max_length = 500, default = increment_invoice_number, null = True, blank = True)
invoice_date = models.DateField()
invoice_receivable=models.ForeignKey(Receivables,null=True)
total_amount=models.DecimalField(decimal_places=2,max_digits=20)
total_amountwithtax=models.DecimalField(decimal_places=2,max_digits=20)
def __str__(self):
return self.invoice_number
class serviceinvoiceitems(models.Model):
user=models.ForeignKey(settings.AUTH_USER_MODEL,related_name='serviceinvoiceitems')
invoice_number=models.ForeignKey(serviceinvoice)
Product=models.CharField(max_length=1000,null=True)
UOM=models.CharField(max_length=100,null=True)
Quantity=models.FloatField(null=True)
Rate=models.FloatField(null=True)
Tax_rate=models.FloatField(null=True)
def __str__(self):
return self.invoice_number
forms.py
createinvoiceformset = inlineformset_factory(serviceinvoice, serviceinvoiceitems,fields='__all__')
class createinvoice(forms.ModelForm):
class Meta:
model = serviceinvoice
exclude = ('user',)
widgets = {
'invoice_date': forms.DateInput(attrs={'class':'datepicker'}),
}
views.py
#login_required
def createinvoice(request):
if request.method == 'POST':
inv_form=createinvoice(data=request.POST)
if inv_form.is_valid():
new_form=inv_form.save(commit=False)
new_formset=createinvoiceformset(request.POST,instance=new_form)
if new_formset.is_valid():
new_form.save()
new_formset.save()
return HttpResponse('Invoice created')
else:
inv_form=createinvoice()
new_formset=createinvoiceformset(instance=serviceinvoice())
inv_form.fields["invoice_receivable"].queryset=Receivables.objects.filter(user=request.user)
return render(request,'account/createinvoice.html',{'inv_form':inv_form,'new_formset':new_formset})
This is rendered in template with following error.
_wrapped_view() missing 1 required positional argument: 'request'
Traceback
Environment:
Request Method: GET
Request URL: http://localhost:8000/invoice/createinvoice/
Django Version: 1.8.9
Python Version: 3.4.0
Installed Applications:
('invoice',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware')
Traceback:
File "C:\Python34\lib\site-packages\django\core\handlers\base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Python34\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
22. return view_func(request, *args, **kwargs)
File "D:\pythonspace\tiktant\invoice\views.py" in createinvoice
106. inv_form=createinvoice(instance=request)
Exception Type: TypeError at /invoice/createinvoice/
Exception Value: _wrapped_view() missing 1 required positional argument: 'request'
Your view name createinvoice clashes with your form createinvoice. They should be different.
Your code would be much clearer if you used underscores for function names (e.g. def create_invoice(...)), and CamelCase for class names (e.g. class CreateInvoice(...), CreateInvoiceFormSet, ...)

'str' object has no attribute 'get' (Django)

Ahoy Mateys!
got a simple model with a simpel form here:
class Hardware(models.Model):
type_name = models.CharField(max_length=60)
def __unicode__(self):
return self.type_name
class HardwareForm(ModelForm):
class Meta:
model = Hardware
fields = ['type_name']
and this is used by my simple views function:
def createHardware(request):
if request.method == 'POST':
form = HardwareForm('request.POST')
if form.is_valid():
new_hardware = form.save()
return render_to_response('administration/overview.html')
else:
form = HardwareForm()
return render_to_response('administration/create_hardware.html', {
'form': form, }, context_instance = RequestContext(request))
this is the Traceback:
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/ticket/createHardware/
Django Version: 1.6.6
Python Version: 2.7.8
Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'ticket')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware')
Traceback:
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
112. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\bachi_000\workspace\Help\src\ticket\views.py" in createHardware
155. if form.is_valid():
File "C:\Python27\lib\site-packages\django\forms\forms.py" in is_valid
129. return self.is_bound and not bool(self.errors)
File "C:\Python27\lib\site-packages\django\forms\forms.py" in errors
121. self.full_clean()
File "C:\Python27\lib\site-packages\django\forms\forms.py" in full_clean
273. self._clean_fields()
File "C:\Python27\lib\site-packages\django\forms\forms.py" in _clean_fields
282. value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
File "C:\Python27\lib\site-packages\django\forms\widgets.py" in value_from_datadict
207. return data.get(name, None)
Exception Type: AttributeError at /ticket/createHardware/
Exception Value: 'str' object has no attribute 'get'
so i got several forms with much more data in it, and there is no problem to pass an empty form to the html page, fill it out and POST them back to the function to get the data in the form. run is_valid() and pass the data to a new instance of the model (to add some more data to it)
why do i get here this error?
You need to be passing in a dictionary to your HardwareForm, not a string.
Change in your views.py
form = HardwareForm('request.POST')
to:
form = HardwareForm(request.POST)

Django - AttributeError: 'Fichas' object has no attribute 'update'

I have a serializer that verify if some fields are empty or not. If a field is empty all works perfectly, but if all the fields are correct I obtain and AttributeError: 'Fichas' object has no attribute 'update'.
This is the view and the serializer:
views.py
class PublicarFichaViewSet(APIView):
permission_classes = (IsAuthenticated, GroupPermission)
def get_object(self, pk):
try:
return Fichas.objects.get(pk=pk)
except:
raise Http404
def get(self, request, pk, format=None):
ficha = self.get_object(pk)
serializer = PublicarFichaSerializer(ficha)
return Response(serializer.data)
def put(self, request, pk, format=None):
ficha = self.get_object(pk)
serializer = PublicarFichaSerializer(ficha, data=request.DATA)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
serializer.py
class PublicarFichaSerializer(serializers.Serializer):
Centro_responsable = serializers.CharField(required=True, max_length=64)
Autor_de_la_ficha = serializers.CharField(required=True, max_length=64)
Correo_electronico_del_autor_de_la_ficha = serializers.EmailField(required=True)
Autor_del_caso_de_estudio = serializers.CharField(required=True, max_length=64)
Correo_electronico_del_autor_del_caso_de_estudio = serializers.EmailField(required=True)
Tutor = serializers.CharField(required=True, max_length=64)
Correo_electronico_del_tutor = serializers.EmailField(required=True)
Fecha_de_tutela = serializers.DateField(required=True)
Titulo = serializers.CharField(required=True, max_length=64)
Tipo_de_objeto_u_obra_por_su_funcion = serializers.CharField(required=True, max_length=64)
Plano_de_situacion = serializers.CharField(required=True, max_length=64)
Fecha_de_validez_legal = serializers.DateField(required=True)
Ficha_publicada = serializers.BooleanField()
def validate_Ficha_publicada(self, attrs, source):
if not attrs['Ficha_publicada']:
raise serializers.ValidationError("Ficha no publicada")
return attrs
EDIT: The traceback
Environment:
Request Method: POST
Request URL: http://localhost:8000/publicarficha/1/
Django Version: 1.6.5
Python Version: 2.7.6
Installed Applications:
('django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'corsheaders',
'rest_framework',
'phi_catalogo',
'rest_framework.authtoken',
'django_evolution',
'django.contrib.admin',
'multiselectfield',
'django_extensions',
'pytz')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'corsheaders.middleware.CorsMiddleware')
Traceback:
File "/Users/jian/phi/env/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
112. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/jian/phi/env/lib/python2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view
57. return view_func(*args, **kwargs)
File "/Users/jian/phi/env/lib/python2.7/site-packages/django/views/generic/base.py" in view
69. return self.dispatch(request, *args, **kwargs)
File "/Users/jian/phi/env/lib/python2.7/site-packages/rest_framework/views.py" in dispatch
403. response = self.handle_exception(exc)
File "/Users/jian/phi/env/lib/python2.7/site-packages/rest_framework/views.py" in dispatch
400. response = handler(request, *args, **kwargs)
File "/Users/jian/phi/backend/phi_catalogo/views.py" in put
148. if serializer.is_valid():
File "/Users/jian/phi/env/lib/python2.7/site-packages/rest_framework/serializers.py" in is_valid
550. return not self.errors
File "/Users/jian/phi/env/lib/python2.7/site-packages/rest_framework/serializers.py" in errors
542. ret = self.from_native(data, files)
File "/Users/jian/phi/env/lib/python2.7/site-packages/rest_framework/serializers.py" in from_native
375. return self.restore_object(attrs, instance=getattr(self, 'object', None))
File "/Users/jian/phi/env/lib/python2.7/site-packages/rest_framework/serializers.py" in restore_object
335. instance.update(attrs)
Exception Type: AttributeError at /publicarficha/1/
Exception Value: 'Fichas' object has no attribute 'update'
Try using a ModelSerializer instead of the Serializer as a super class.