Hello!

As you see on the documentation (
https://docs.djangoproject.com/en/2.0/topics/class-based-views/) for the
class based views, any arguments you pass to the class based view
.as_view() method will override attributes of the class based view, so if
you set MyCView.as_view(model=Foo) is the same as setting class MyCView:
model=Foo directly.

Now to access the field names of the Model, you used to be able to call a
.get_field_names() or something like that but that is depreciated since
1.10. Now to do that you should use the Model._meta to get_fields(). Check
the documentation for the Model._meta to check its full potential.

Hope it helps!

On Wed, Jun 6, 2018, 07:33 Mikkel Kromann <[email protected]> wrote:

> Thanks for the advice, Andréas.
> But the response is the same:
>
>   File "C:\Users\ ... xxxxxxx   ... \items\views.py", line 7, in
> ItemUpdateView
>     fields = self.model.fields
> NameError: name 'self' is not defined
>
>
>
> As far as I understood, model is an attribute, not a method (though I'm
> new to Python and Django, so I'm unsure about this).
> Does attribute/method make a difference in this case?
>
> cheers, Mikkel
> tirsdag den 5. juni 2018 kl. 22.10.31 UTC+2 skrev Andréas Kühne:
>>
>> Hi,
>>
>> Have you tried self.model? It should be present in all methods in the
>> class?
>>
>> Regards,
>>
>> Andréas
>>
>> 2018-06-05 21:56 GMT+02:00 Mikkel Kromann <[email protected]>:
>>
>>> Dear Django-users.
>>>
>>> I'm slowly working towards a Django "data-warehouse" framework, where I
>>> can easily add a lot of models (each containing a table with data), while
>>> sticking to only few reusable views.
>>>
>>> I've realised that in urls.py, it is possible to specify the model on
>>> which the UpdateView is going to do its magic.
>>> This allows me to use a generic UpdateView (which I called
>>> ItemUpdateView) and template for all my models, which will save me a ton of
>>> almost identical lines of code.
>>>
>>> However, in the generic ItemUpdateView, I of course need to specify the
>>> fields of the specific model chosen in urls.py.
>>> As I ideally only want a few generic views (i.e. ItemCreateView,
>>> ItemUpdateView, ItemDeleteView and ItemListView), I've chosen to place the
>>> field array in my model definition, hoping to be able to access it from my
>>> generic Class Based Views
>>>
>>> But how do I access the model attribute in (Item)UpdateView
>>>
>>>
>>> thanks, Mikkel
>>>
>>> From views.py
>>> from django.views.generic import CreateView, ListView, UpdateView,
>>> DeleteView
>>>
>>> class ItemUpdateView(UpdateView):
>>>     template_name = "item_form.html"
>>> # How do I access the model attribute of ItemUpdateView as given in
>>> urls.py?
>>> # This line below returns the error "NameError: name 'model' not defined"
>>>     fields = model.fields
>>>
>>> From urls.py
>>> from django.urls import path
>>> from . views import ItemUpdate
>>> from . models import Region, Location
>>>
>>> # Awesome! I can specify the model to be used by ItemUpdateView
>>> urlpatterns = [
>>>     path('update/region/<pk>',    ItemUpdateView.as_view(model=Region),
>>>     name='region_update'),
>>>     path('update/location/<pk>',  ItemUpdateView.as_view(model=Location
>>> ),   name='location_update'),
>>> ]
>>>
>>>
>>>
>>> From models.py (Region and Location are only two of my tables, I'd like
>>> to have say 20 or 30 models
>>> from django.db import models
>>>
>>> # Abstract class for our items including common methods, data and
>>> definitions
>>> class ItemModel(models.Model):
>>>
>>>     fields = [ 'label', 'short', 'descr' ]
>>>     label   = models.CharField(max_length=10)
>>>     short   = models.CharField(max_length=15)
>>>     descr   = models.CharField(max_length=40)
>>>
>>>     def __str__(self):
>>>         return self.short
>>>
>>>     class Meta:
>>>         abstract = True
>>>
>>> class Region(ItemModel):
>>>     fields  = [ 'label', 'short', 'descr' ]
>>>
>>> class Location(ItemModel):
>>>     fields  = [ 'label', 'short', 'descr', 'region' ]
>>>     region  = models.ForeignKey(Region, on_delete=models.CASCADE)
>>>
>>> class Plant(ItemModel):
>>>     fields  = [ 'label', 'short', 'descr', 'location', 'capex', 'opex',
>>> 'capacity' ]
>>>     location= models.ForeignKey(Location, on_delete=models.CASCADE)
>>>     capex   = models.DecimalField(decimal_places=3, max_digits=8)
>>>     opex    = models.DecimalField(decimal_places=3, max_digits=8)
>>>     capacity= models.DecimalField(decimal_places=3, max_digits=8)
>>>
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Django users" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> To post to this group, send email to [email protected].
>>> Visit this group at https://groups.google.com/group/django-users.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/django-users/ec4634e5-2279-49a7-9045-21712de87584%40googlegroups.com
>>> <https://groups.google.com/d/msgid/django-users/ec4634e5-2279-49a7-9045-21712de87584%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>> --
> You received this message because you are subscribed to the Google Groups
> "Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/django-users.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/django-users/95db9cca-58ca-4460-ae39-9150bb199bff%40googlegroups.com
> <https://groups.google.com/d/msgid/django-users/95db9cca-58ca-4460-ae39-9150bb199bff%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/CABF8kZPUE%3D28An1Qv5zDurb2y%3DohhTkYN-hxAgVLDhhR7m24bA%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to