On Thu, May 30, 2013 at 9:57 AM, tony gair <tonytheg...@gmail.com> wrote: > > I am using CBV / django braces for authentication. My user authorisation > model inherits abstractuser and adds a few fields which are foreign keys to > two other models organisation and premises. > > When a form initialises I want to be able to examine the details of the user > logged in , look to see if they are a is_superuser or is_staff and occupy > my organisation and premises form fields accordingly using the values stored > as foreign keys in the logged on and authenticated user. > > My main problem at the moment is that I get a KeyError for the line > 'self.user=kwargs.pop('user')' centered on 'user' > > > #heating/forms.py > from django import forms > from .models import Organisation, Premises, Heating_User, Room, Heater > > class HeatingUserForm ( forms.ModelForm): > > def __init__(self, *args, **kwargs): > self.user=kwargs.pop('User') > super(HeatingUserForm, self).__init__(*args, **kwargs) > if self.user.is_superuser: > self.fields['premises'].queryset = Premises.objects.all() > elif self.user.is_staff: > self.fields['premises'].queryset = > Premises.objects.filter(organisation=self.user.organisation) > else: > self.fields['premises'].queryset = > Premises.objects.filter(id=self.user.premises) > > > #models.py > from django.conf import settings > from django.core.urlresolvers import reverse > from django.db import models > from django.contrib.auth.models import AbstractUser > > class Heating_User (AbstractUser): > jobtitle = models.CharField(max_length=255) > organisation = models.ForeignKey(Organisation, null=True) > premises = models.ForeignKey(Premises, null= True) > def __unicode__(self): > return self.username > def get_absolute_url(self): > return reverse('users-detail', kwargs={'pk':self.pk}) > #end of files > > > can anyone see where I am going wrong here? >
'user' is not an argument that is supplied to every form that is initialised, I was trying to explain this to you yesterday. Yesterday you said are using a CBV. A CBV that deals with forms probably uses the FormMixin to provide it's form handling: https://docs.djangoproject.com/en/1.5/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin FormMixin defines various functions and attributes on the class, which you can customise in your derived version of the class to give specialised effects. The one you'll need to change in order to pass user to the form constructor is get_form_kwargs(). You will want to do something like this: class MyClassBasedView(UpdateView): form_class = HeatingUserForm def get_form_kwargs(self): kwargs = super(MyClassBasedView, self).get_form_kwargs() kwargs['user'] = self.request.user return kwargs Then, when your class based view instantiates your form, it will provide the correct arguments. Cheers Tom -- 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 django-users+unsubscr...@googlegroups.com. To post to this group, send email to django-users@googlegroups.com. Visit this group at http://groups.google.com/group/django-users?hl=en. For more options, visit https://groups.google.com/groups/opt_out.