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+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=en.
No comments:
Post a Comment