Hello,
Hopefully it becomes clear as well from my code but, here is what is going
on. There is an Athlete registration form which has a long list of choices
or communities in the form of a multiple choices that the user can select
to then become a part of the communities they select. Then what I'm trying
to do is in my EditProfile view basically render this long list of multiple
choices again but obviously it would make sense to show the user what ones
they have selected/are already in, be able to deselect from this group to
remove themselves from the ones they selected on registration, or to select
new ones to then be added to those communities.
My EditProfile view:
# AU Athlete Edit Profile
def EditProfile(request):
if request.user.is_authenticated():
contexterror = {}
context = {}
contexterror = {'Error': 'Error'}
# Since it is the generic view know we know if the user in the
request is a specific group this way
if request.user.groups.filter(name='Athletes').exists():
# Since it is the generic view know we know if the user in the
request is in 'Athletes' / member of of the 'Athletes' Group
if request.method == 'POST':
userprofile = UserProfileUpdateForm(request.POST,
instance=request.user)
athleteprofile = AthleteProfileUpdateForm(request.POST,
instance=request.user.profile)
# Need to make it so it checks the forms properly and saves
the info if its correct
if userprofile.is_valid() and athleteprofile.is_valid():
# Do something with the user selected athlete groups
below
athletegroupsids = request.POST.getlist(
'athletecommunities')
# Iterate though all the athlete group names and
collect the objects which we can use to add the request.user to those
athlete groups
for athletegroupLOWERCASEname in athletegroupsids:
# Filter through all the communities and take the
check box selection id which is lowercase and compare it to the
communityurl which is the lowercase name
AthleteCommunities = Community.objects.get(url =
athletegroupLOWERCASEname)
# Check to make sure we have one athlete community
that we want to add the athlete to
# Get the name of the athlete community
AthleteCommunityName = AthleteCommunities.name
# By taking the desired athlete community name and
filtering down the Athlete Group name be then add the user to the group
AddAthleteToGroup =
Group.objects.get(name=AthleteCommunityName)
AddAthleteToGroup.user_set.add(request.user.athlete.athleteuser)
# Now the user has been added to all the groups they
selected and notifications will go when a post is made in each respective
group
# Save the two forms to the database
userprofile.save() and athleteprofile.save()
return HttpResponseRedirect('/profile/')
else:
user = request.user
profile = user.profile
userprofile = UserProfileUpdateForm(instance = user)
athleteprofile = AthleteProfileUpdateForm(instance =
profile)
context = {'AthleteProfileUpdateForm': athleteprofile,
'UserProfileUpdateForm': userprofile}
return render_to_response('editprofile.html', context,
context_instance = RequestContext(request))
return render_to_response('editprofile.html', contexterror,
context_instance = RequestContext(request))
return HttpResponseRedirect('/login/')
My forms.py:
from django import forms
from django.forms import ModelForm
from django.contrib.auth.models import User
from athletesunited.athletes.models import Athlete
# Athlete Community Choices
ATHLETECOMMUNITIESCHOICES = (('archery', 'Archery',), ('mensbasketball',
'Men\'s
Basketball',), ('womensbasketball', 'Women\'s Basketball',), ('baseball',
'Baseball',), ('cardio', 'Cardio',), ('cheerleading', 'Cheerleading',), (
'crochet', 'Crochet',), ('dieting', 'Dieting',), ('football', 'Football',),
('golf', 'Golf',), ('gymnastics', 'Gymnastics',), ('hockey', 'Hockey',), (
'injuryrecovery', 'Injury Recovery',), ('lacrosse', 'Lacrosse',), ('lifting',
'Lifting',), ('rugby', 'Rugby',), ('racing', 'Racing',), ('swimming',
'Swimming',), ('soccer', 'Soccer',), ('skateboarding', 'Skateboarding',), (
'tennis', 'Tennis',), ('wrestling', 'Wrestling',))
# Athlete Update Profile Form
class AthleteProfileUpdateForm(ModelForm):
athletebirthday = forms.CharField(label=(u'Athlete Birthday:'))
athleteurl = forms.CharField(label=(u'Athlete Url:'))
#athletecommunities = forms.MultipleChoiceField(label=(u'Athlete
Communities:'), widget=forms.CheckboxSelectMultiple, required=False,
choices=ATHLETECOMMUNITIESCHOICES)
class Meta:
model = Athlete
exclude = ('athleteuser',)
fields = ['athletebirthday', 'athleteurl', 'athletecommunities',
'athletecolleges',]
def selected_athlete_communities(self):
return [athletecommunities[0] for athletecommunities
inATHLETECOMMUNITIESCHOICES]
My model for the athlete:
from django.contrib.auth.models import User
# Athlete User
class Athlete(models.Model):
athleteuser = models.OneToOneField(User)
athletebirthday = models.DateField()
athleteurl = models.CharField(max_length=30) # Must limit
to a-z && A-Z && and 0-9 chars
athletecommunities = models.ManyToManyField('communities.Community')
athletecolleges = models.ManyToManyField('colleges.College')
User.profile = property(lambda u:
Athlete.objects.get_or_create(athleteuser=u)[0])
def __unicode__(self):
return self.athleteuser.first_name + " " +
self.athleteuser.last_name
The relevant parts of my template for editprofile, just simply showing the
form is all:
<form action="" method="post">{% csrf_token %}
{% for field in AthleteProfileUpdateForm %}
{{ field.label }}
{{ field }}
{{ field.error }}
<p>
{% endfor %}
<input type="submit" alt="post" value="Update" />
</form>
As you can see from the pictures, when I do athleteprofile =
AthleteProfileUpdateForm(instance = profile) in my view in the picture
named "showingcommunities" you can see there is this little box that has
greyed out some community names. This is great and occurs when this line
"athletecommunities = forms.MultipleChoiceField(label=(u'Athlete
Communities:'), widget=forms.CheckboxSelectMultiple, required=False,
choices=ATHLETECOMMUNITIESCHOICES)" is commented out in my update athlete
profile form. I was really optimistic when I saw this as I could see that
indeed I was rendering which communities the user is actually in. However,
when I add this following line back to my forms "athletecommunities =
forms.MultipleChoiceField(label=(u'Athlete Communities:'),
widget=forms.CheckboxSelectMultiple, required=False,
choices=ATHLETECOMMUNITIESCHOICES)" you would see the second picture
"notshowingcommunities" because basically there are the checkboxes but the
ones the user is actually in are not rendering. What I mean is the
checkboxes that correspond to what communities the user selected do not
show up as checked. They all show up as empty.
I have used a BooleanField before as a flag and it does hold its value, I
can see the checked box in i.e. an edit form if on creation of that object
the user checks the box. I would really hate to have to make about 20
boolean fields for an athlete to correspond to my communities. Not to
mention every time I want to add a community I would have to add more
fields on the model, when I'd prefer to just add to my
ATHLETECOMMUNITIESCHOICES the new communities. I've been trying a lot but I
really can't seem to find a resource that helps me simply just render what
options were selected on this multiplechoicefield, I tried
modelmultiplechoicefield as well.
Thanks for helping, also if you have a better and nicer form concept I can
try please let me know. Even though these checkboxes could work I'm not
super satisfied with how this looks, I'd have to think up more ideas
probably because I don't usually build websites that require an interface
with a large relationship such as my athlete being in multiple communities
and selecting and deselecting.
JJ
--
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.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/e82ced3f-c971-44c7-9317-a7afa9ac0b8c%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.