I have been beating my head against the wall trying to figure this out. I
came up with a simplified example to illustrate what I'm trying to do.
Posit a hypothetical university application; say, a system where students,
faculty and administration can all participate. There are different
privilege levels and different areas of functionality, so students will
never see the screens that professors use for tracking assignments, etc.
The various permissions will be designated by somebody's Position, which
includes student (undergrad), student (graduate), TA, professor, and dean.
(This is a contrived example, to try to illustrate what I'm trying to
accomplish.) As you can see, a User can have multiple Positions: grad
student and TA, or professor and dean. The areas of functionality are also
accessible by overlapping Positions, with the Position determining how much
they can do in that screen. As I said, students will not even know of the
assignment tracking screen, but TAs and professors will, and professors
will be able to do more in it. Professors will not see the administration
functions, unless they are also a dean.
I plan to have a single User and login per person. Users with multiple
Positions will be prompted which one to use per session. Here is the
models.py:
from django.db import models
# Create your models here.
class Position (models.Model):
CHOICES = ( ('pub', 'Publish'), ('die', 'Perish') )
title = models.CharField (max_length=32)
privileges = models.CharField (max_length=3, choices=CHOICES)
class User (models.Model):
login = models.EmailField (unique=True)
name = models.CharField (max_length=32)
password = models.CharField (max_length=32)
positions = models.ManyToManyField (Position, through='UserPosition')
def __str__ (self): return self.name
class UserPosition (models.Model):
user = models.ForeignKey (User)
position = models.ForeignKey (Position)
effectDate = models.DateField()
So there's an intermediate model for the M2M relationship so I can store
extra information per User/Position.
Here's the stock admin.py:
from django import forms
from django.contrib import admin
from forum.models import *
admin.site.register (User)
admin.site.register (Position)
This is the view. As you can see, it doesn't accommodate hooking up the
new User with any Position(s).
<https://lh5.googleusercontent.com/-GTpKr_79dzA/Uh6omJ2GvQI/AAAAAAAAAAU/enukY8_NLKE/s1600/screenshot01.png>
So I wrote a UserAdmin and a form to go with it. The new admin.py:
# imports
class UserPositionAdmin (admin.TabularInline):
model = UserPosition
extra = 1
class UserCreationForm (forms.ModelForm):
class Meta:
model = User
class UserAdmin (admin.ModelAdmin):
form = UserCreationForm
inlines = (UserPositionAdmin,)
admin.site.register (User, UserAdmin)
admin.site.register (Position)
Now the input form looks like this:
<https://lh3.googleusercontent.com/-9H2GKxWu4Mc/Uh6pKheSkpI/AAAAAAAAAAc/SaJtsELbnDE/s1600/screenshot02.png>
Now my problem is that I require each User to have at least one Position,
but I can't figure out how to get the form to fail validation (i.e., in the
clean() call) if no Position is selected in the inline. I've tried waiting
until the User's save() function is reached, and tried checking in the
UserAdmin's save_model(), but so far have been unable to find out at those
points if a Position was selected before form submission or not. So I
think the UserCreationForm is the right place to check for it.
The problem seems to be that the field isn't technically part of the User
class, so the form validation doesn't look for a clean_userpositions()
function. I tried creating a function by that name, but it never got
called if the Position was blank (I didn't test with a valid Position
selection).
It seems to me this can't possibly be something nobody's ever done before,
but I haven't been able to find the answers even in the voluminous Django
1.5 documentation. I would greatly appreciate direction on how to validate
that a Position is selected.
Thanks in advance.
--
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 http://groups.google.com/group/django-users.
For more options, visit https://groups.google.com/groups/opt_out.