开发者

Error when wrapping the view of a 3rd-party Django app? (Facebook, django-socialregistration, django-profiles)

I'm using django-socialregistration to manage my site's connection with Facebook.

When a user clicks the "Connect with Facebook" button, I am able to automatically create a new Django user and log them in. However, I also need to create a UserProfile (my AUTH_PROFILE_MODULE) record for them which contains their Facebook profile information (email, name, location).

I believe I need to override socialregistration's "setup" view so I can do what I need to do with UserProfile. I've added the following to my project's urls.py file:

url( r'^social/setup/$', 'myapp.views.socialreg.pre_setup', name='socialregistration_setup'),

My custom view is her开发者_StackOverflowe "/myapp/views/socialreg.py" and looks like:

from socialregistration.forms import UserForm

def pre_setup(request, template='socialregistration/setup.html', 
              form_class=UserForm, extra_context=dict()):
    # will add UserProfile storage here...
    return socialregistration.views.setup(request, template, form_class, extra_context)

The socialregistration view signature I'm overriding looks like this:

def setup(request, template='socialregistration/setup.html',
          form_class=UserForm, extra_context=dict()):
    ...

I'm getting the error "ViewDoesNotExist at /social/setup/: Could not import myapp.views.socialreg. Error was: No module named socialregistration.views" when I try the solution above.

The socialregistration app is working fine when I don't try to override the view, so it is likely installed correctly in site-packages. Anyone know what I'm doing wrong?


OK, as Tim noted, this particular problem was path related.

Bigger picture, the way to accomplish what I wanted (creating a linked UserProfile when django-socialregistration creates a user) is best done by passing in a custom form into socialregistration's "setup" view, as the author suggested here: http://github.com/flashingpumpkin/django-socialregistration/issues/issue/36/#comment_482137

Intercept the appropriate url in your urls.py file:

from myapp.forms import UserForm    
url('^social/setup/$', 'socialregistration.views.setup', 
    { 'form_class': UserForm }, name='socialregistration_setup'),
(r'^social/', include('socialregistration.urls')), 

You can base your UserForm off socialregistration's own UserForm, adding in code to populate and save the UserProfile.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜