# 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 in ATHLETECOMMUNITIESCHOICES]
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 django-users+unsubscribe@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.
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.
No comments:
Post a Comment