Thanks Daniel. 

Both your proposed solutions worked very well.
For now, I don't have other information stuffed into my model definitions, 
so the urls.py approach could do.
However, if I decide to put more information into models.py, the def 
dispatch() approach could be useful.

One question though: 
Do I understand correctly, that your version of def dispatch() overwrites 
the Django dispatch method from UpdateView.
As far as I can see, it checks the validity of the request method.
Could I use def __init__ instead of def dispatch


thanks + cheers, Mikkel


From 
https://ccbv.co.uk/projects/Django/2.0/django.views.generic.edit/UpdateView/
def dispatch(self, request, *args, **kwargs):
    # Try to dispatch to the right method; if a method doesn't exist,
    # defer to the error handler. Also defer to the error handler if the
    # request method isn't on the approved list.
    if request.method.lower() in self.http_method_names:
        handler = getattr(self, request.method.lower(), self.
http_method_not_allowed)
    else:
        handler = self.http_method_not_allowed
    return handler(request, *args, **kwargs)




onsdag den 6. juni 2018 kl. 16.12.06 UTC+2 skrev Daniel Germano Travieso:
>
> Ok! I think I see your problem.
>
> It is a deeper understanding of python classes that may be the problem.
> You see, "model" and "self" are class atributes of the python class that 
> houses your class based view (as every class in django is first a python 
> class).
>
> So, if you try to access the attribute "model" of the class, or the 
> attribute "self", a attribute that houses the instance of the class, on 
> it's class attributes definitions you will have problems, as the python 
> interpreter only load these modules lazyly, not actually going through on 
> finding the value for the attribute you referenced.
>
> One solution is to have that value (for the attribute "field" as a 
> @property that is a function that then the python interpreter will go 
> through and execute the reference lookup.
>
> Another solution is to set that value to be initially None, and set the 
> value for the fields on the dispatch method of the view, something like 
> class ItemUpdateView(UpdateView):
>   template_name="foo.html"
>   fields = None
>  
>   def dispatch (self, request, *args, **kwargs):
>     self.fields = self.model.fields
>     return super(ItemUpdateView, self).dispatch(request, *args, **kwargs)
>
>
>
> But as of my understanding of your problem, you are trying to just 
> customize which form fields to display to the user based on which model the 
> user is updating, so you could just specify the form_class attribute on the 
> path (just as you did with the model).
>
> Hope it helps!
>
>
> On Wed, Jun 6, 2018, 10:36 Mikkel Kromann <[email protected] 
> <javascript:>> wrote:
>
>> Hello Daniel.
>>
>> Thank you for your reply. Perhaps I was not explicit enough in describing 
>> my problem - it is far simpler than your solution indicates.
>> In my model definitions, I already have a list of the fields to be 
>> represented in the form of UpdateView - it is an attribute in the form of a 
>> simple array called "fields".
>> I don't want UpdateView to make a form for all columns of the model's 
>> data table, just the fields from my custom array in the Model objects.
>>
>> My problem is simply: How to access my custom attribute "field" in the 
>> Model attribute passed to the Class Based View function.
>> As described, I get compilation errors, complaining that "model" and 
>> "self" are names not defined.
>> From the documentation (and my so far not too great Python understandign) 
>> it is not clear to me whether "Model" is simply the name of the model, or 
>> if it is the entire Model object instance.
>>
>>
>> thanks again, Mikkel
>>
>>
>> onsdag den 6. juni 2018 kl. 15.01.05 UTC+2 skrev Daniel Germano Travieso:
>>>
>>> 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] <javascript:>.
>> To post to this group, send email to [email protected] 
>> <javascript:>.
>> 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/c857567f-dd71-46c1-a05b-787566bfa180%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/django-users/c857567f-dd71-46c1-a05b-787566bfa180%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/b6502b29-81e6-449e-894b-16f92ed5e871%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to