Aargh. Just aaargh. There are so many things wrong with this code I hardly 
know where to start. Please, try reading some of the documentation, 
especially the bit about the uses of `get` vs `filter`.

On Sunday, 9 October 2011 20:00:36 UTC+1, Kayode Odeyemi wrote:
>
> Hello,
>
> I'm using Django ModelForm on add/edit URLs which are both sharing a single 
> template file. The 
> code I'm working with is like this:
>
> class WebappAuthorize(models.Model):
>     institution_name = models.CharField(max_length=32, help_text="Enter 
> your institution name")
>     email = models.CharField(max_length=20, help_text="Example, 
> te...@example.com", default=get_current_user(object(), 'email'))
>

You can't do that. The `default` is either a constant, or a callable that 
takes no parameters. Passing `object()` as a parameter is nonsense in any 
case.
 

>     institution_logo = models.FileField(upload_to=api.file_upload('files', 
> 'logo'), 
>         blank=True, help_text="Upload your institution logo")
>     institution_url = models.CharField(max_length=50, blank=True, 
> help_text="Example, http://example.com";)
>     phone = models.IntegerField(null=True, blank=True, help_text="Enter a 
> phone number")
>     class Meta:
>         db_table = u'authorize'
>
> forms.py
> ------------
> class AuthorizeForm(forms.ModelForm):
>     class Meta:
>         model = WebappAuthorize
>
> views.py
> ------------
> def get_current_user(request, **kwargs):
>     if kwargs['email']:
>         # select email from User where
>         request_email = User.objects.filter(email=request.user)
>         email = request_email.values('email')
>         edict = email[0]
>         return edict.get('email')
>

What? The current user is available directly via `request.user`. No need to 
do another query to get it from request.user, that's just too strange. 
request.user is *already* a User object, and so you can get the email from 
request.user.email. I really don't understand this mucking about with 
`values`.
 

>
> def authorize(request):    
>     request_user = User.objects.filter(username=request.user)
>     username = request_user.values('username')
>     udict = username[0]
>     u = str(udict.get('username'))
>

And again, this is nonsense. The current username is 
`request.user.username`.
 

>     context = {'page_title' : 'Authorize your institution'}
>     
>     consumer_obj = WebappOauthConsumer.objects.filter(user=u) # get user_id 
> from user
>

As you've done it above `u` is a string, not a User object. You haven't 
posted the code of the WebappOauthConsumer object, but unless `user` is a 
CharField (which I *really* hope it isn't) instead of a ForeignKey to User, 
this won't work.
 

>     print consumer_obj
>     
>     c = consumer_obj.values('user_id')
>

Aargh, more mucking about with `filter` and `values`. If you want a single 
object, use `get`. And to get the user_id from that, you can do 
`consumer_obj.user_id`. Except of course that you already know the user_id, 
because you had to give it to your query in the first place... it's the same 
as `request.user.id`.

 

>     for i in c:
>         if i.get('user_id') == u:
>

What? If there's a WebappOauthConsumer object (which you've queried by user) 
whose user_id is the same as the user_id you used to query it with, then 
redirect? How can that make sense?
 

>             return redirect('update-authorize-institution', user=u, 
> action='update')
>     
>     if request.method == 'POST':
>         authorize_form = AuthorizeForm(request.POST, request.FILES)
>         if authorize_form.is_valid():
>             print request.POST
>             ckey = consumer.generate(request.POST.get('institution_name', 
> ''))
>             if ckey is not None:
>                 oauthconsumer_model = WebappOauthConsumer()
>                 oauthconsumer_model.user = User(u)
>                 oauthconsumer_model.institution_name = 
> WebappAuthorize(request.POST.get(u'institution_name', ''))
>

Don't use values from request.POST, use `authorize_form.cleaned_data`. 
 

>                 oauthconsumer_model.consumer_key = ckey.get('consumer_key')

                oauthconsumer_model.consumer_secret = 
> ckey.get('consumer_secret')
>

Oh look, more mucking around with `get`. `consumer.generate` is your own 
function, which presumably returns a dictionary - so since you know it's 
going to have the right keys, use ckey['consumer_key'].
 

>                 oauthconsumer_model.created = int(time.time())
>                 oauthconsumer_model.changed = int(time.time())
>

                oauthconsumer_model.save()
>                 return redirect('update-authorize-institution', user=u, 
> action='update')
>         else:
>             print authorize_form.errors
>

Who's going to see those errors if you print them here? Anyway, always avoid 
the `print` statement as it will cause your server to choke if you 
accidentally leave it in when you release to production.
 

>             
>     else:
>         authorize_form = AuthorizeForm()
>         context['form'] = authorize_form
>         context['action'] = 'new'
>         context['consumer'] = consumer_obj.values().order_by('id')
>         
>         for i in context['consumer']:
>             p = i
>             
>         request.session['consumer'] = p
>

Again, you're looping through a list of one dictionary, then assigning one 
temporary variable to another. What's the point? Why the `values` call? Why 
not just:
    context['consumer']  = consumer_obj
    request.session['consumer'] = consumer_obj
especially as you'll have corrected the use of `filter` as I mentioned 
above.
 

>         
>     return render_to_response("webapp/authorize.html", context, 
> context_instance=RC(request))
>
> And the edit view
> ------------------------
>
> def edit_authorize(request, **kwargs):
>
>     context = {'page_title' : 'Update Authorize your institution'}
>     context['user'] = kwargs['user']
>     context['action'] = kwargs['action']
>     
>     print request.session['consumer']
>     
>     if request.method == 'POST':
>         authorize_form = AuthorizeForm(request.POST, request.FILES)

        oauthconsumer_model.changed = date.today()
>         oauthconsumer_model.save()
>

You seem to be missing the bit where you actually define oathconsumer_model 
- presumably the result of calling `authorize_form.save(commit=False)`.
 

>     
>     else:
>         u = WebappOauthConsumer.objects.get(user=kwargs['user']) # Make 
> sure it returns a single user
>         authorize_form = AuthorizeForm(data=request.POST, 
> files=request.FILES, instance=u) # instance of WebAuthorize
>

It seems completely pointless to pass in `request.POST` here, since you know 
this is not a POST so that dictionary will be empty (as will request.FILES). 
Plus, as your comment notes, AuthorizeForm needs an instance of 
WebappAuthorize, not WebappOathConsumer, which is what `u` is.
 

>         context['form'] = authorize_form    
>     return render_to_response("webapp/authorize.html", context, 
> context_instance=RC(request))
>
> In each of these form fields, I want their values to be set on edit. A fix 
> I'm working with at the moment
> is to store the values in session variables, then print it on the input 
> value property of each form field in 
> the template file.
>
> {{ request.session.consumer.institution_name_id}}
> <div class="group">
>                     <label for="{{ form.institution_name.name }}" 
> class="label">{{ form.institution_name.label }}</label>
>                     {% if action == 'update' %}
>                         <input class="text_field" type="text" 
> disabled="disabled" name="{{ institution_name_id }}" value="{{ 
> request.session.consumer.institution_name_id }}" />
>                     {% else %}
>                         <input class="text_field" type="text" name="{{ 
> form.institution_name }}" value="{{ 
> request.session.consumer.institution_name_id }}" />
>                     {% endif %}
>                     {{ form.institution_name.help_text }}
>                 </div>
>                 <div class="group">
>                     <label for="{{ form.email.name }}" class="label">{{ 
> form.email.label }}</label>
>                     {{ form.email }}
>                     {{ form.email.help_text }}
>                 </div>
>
> For example, on the email field, I want its value prepopulated on edit. I 
> tried using the default field option
> on the model, but there's no easy way of getting logged in user outside 
> views.py. To provide a workaround,
> I created a function in views.py which takes the request object as 
> argument, then I call the function in 
> models.py like so: 
>
> // in models.py
> from webapp.views import get_current_user
>
> email = models.CharField(max_length=20, help_text="Example, 
> te...@example.com", default=get_current_user(object(), 'email'))
>
> But it seems impossible to import views.py into models.py. I'm getting: 
> ImportError: cannot import name get_current_user
>

Well, it's not impossible, but since you're presumably importing models.py 
into views.py, attempting to do the reverse would create a circular 
dependency. But as I noted above, this makes no sense in any case.

Please, how can I get such functionality in my template file.
>


Why don't you just pass the values in `initial` when you instantiate the 
form?
 
    form = AuthorizeForm(initial={'email': request.user.email, 
'institution_name': request.session['institution_name']})


> Thanks
>
> -- 
> Odeyemi 'Kayode O.
> http://www.sinati.com. t: @charyorde
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/django-users/-/sRLqe8IkbBMJ.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to