2012-01-15 16 views
7

Tôi đang sử dụng django-userena. Tôi có một mô hình được gọi là UserProfile. Tôi đã thêm các trường bổ sung trong biểu mẫu đăng ký. và Các trường này được hiển thị chính xác nhưng dữ liệu không được lưu. Tôi cũng muốn lưu một số trường dữ liệu vào một Mô hình khác (Business). Ví dụ: tôi có hai trường như contactbusiness. Tôi muốn trường liên hệ sẽ chuyển đến trường UserProfile Kiểu và business sẽ chuyển đến Business Model. bất kỳ đầu mối? Cảm ơn bạnthêm các trường bổ sung vào các hình thức django-userena

Đây là mã của tôi

class SignupFormExtra(SignupForm): 
    address = forms.CharField(label=_(u'Address'),max_length=30,required=False) 
    contact = forms.CharField(label=_(u'Contact'),max_length=30,required=False) 
    business = forms.CharField(label=_(u'Business Name'),max_length=30,required=False) 

    def save(self): 
     """ 
     Override the save method to save the first and last name to the user 
     field. 

     """ 

     user_profile = super(SignupFormExtra, self).save(commit=False) 

     user_profile.address = self.cleaned_data['address'] 
     user_profile.contact = self.cleaned_data['contact'] 
     user_profile.business = self.cleaned_data['business'] 

     user_profile.save() 

     return user_profile 

UPDATE: Tôi đang lưu trữ những giá trị về một trường hợp tài ... Tôi muốn toe lưu trữ chúng trong Tiểu sử trên mô hình - một ví dụ đó là ràng buộc để người dùng

+0

Bạn đã thử nó trong phương pháp sạch hình thức không? – Ahsan

Trả lời

11

Tác giả của Userena tại đây. Tôi đã có một thư điện tử tương ứng với "no_access", nhưng nó có giá trị chỉ vào giải pháp nếu những người khác có cùng một vấn đề. Sai lầm đầu tiên là phương thức save trả về một cấu hình. Điều này không đúng, nó trả về một Django User. Bởi vì điều này trước tiên bạn phải lấy hồ sơ và thực hiện các thay đổi cho nó. Lưu hồ sơ và sau đó trả lại người dùng để giữ cho nó tương thích với Userena.

Đối với mẫu Business, chỉ cần thêm nó vào phương pháp save.

class SignupFormExtra(SignupForm): 
    address = forms.CharField(label=_(u'Address'),max_length=30,required=False) 
    contact = forms.CharField(label=_(u'Contact'),max_length=30,required=False) 
    business = forms.CharField(label=_(u'Business Name'),max_length=30,required=False) 

    def save(self): 
     """ 
     Override the save method to save the first and last name to the user 
     field. 

     """ 
     # Original save method returns the user 
     user = super(SignupFormExtra, self).save() 

     # Get the profile, the `save` method above creates a profile for each 
     # user because it calls the manager method `create_user`. 
     # See: https://github.com/bread-and-pepper/django-userena/blob/master/userena/managers.py#L65 
     user_profile = user.get_profile() 

     # Be sure that you have validated these fields with `clean_` methods. 
     # Garbage in, garbage out. 
     user_profile.address = self.cleaned_data['address'] 
     user_profile.contact = self.cleaned_data['contact'] 
     user_profile.save() 

     # Business 
     business = self.cleaned_data['business'] 
     business = Business.objects.get_or_create(name=business) 
     business.save() 

     # Return the user, not the profile! 
     return user 

Sau khi tạo biểu mẫu, đừng quên ghi đè biểu mẫu userena trong url của bạn. Một cái gì đó như thế này sẽ làm:

url(r'^accounts/signup/$', 
     userena_views.signup, 
     {'signup_form': SignupFormExtra}), 

Điều đó sẽ làm điều đó! Chúc may mắn.

+0

Tôi nhận được email của bạn. Cảm ơn bạn. Bạn vui lòng kiểm tra linK này? Tôi nghĩ rằng [có lỗi] http://stackoverflow.com/questions/8818435/many-to-many-field-added-to-the-profile-does-not-work-django-userena) – Kulbir

+2

Tuyệt vời! Bây giờ tất cả những gì bạn phải làm là cập nhật tài liệu :) http://docs.django-userena.org/en/latest/faq.html#how-do-i-add-extra-fields-to-forms –

1

Tôi đã thử mẹo trên và dường như hoạt động. Tuy nhiên, tôi đang chạy vào một lỗi và không bao giờ nhận được các chức năng tiết kiệm trong cài đặt của tôi. Tôi có cài đặt này trong tệp cài đặt của mình: USERENA_WITHOUT_USERNAMES = True Vì vậy, khi tôi bổ sung biểu mẫu để bao gồm các trường mới, tôi chưa bao giờ đến phương thức lưu vì tôi nhận được 'trường bắt buộc', đây là trường mà tôi không sử dụng (tên người dùng).

Tôi thấy trong việc tạo ra cái nhìn dòng ở đây: nếu userena_settings.USERENA_WITHOUT_USERNAMES và (signup_form == SignupForm): signup_form = SignupFormOnlyEmail Vì vậy, tôi đã thay đổi ví dụ để phân lớp các SignupFormOnlyEmail thay vì SignupForm và nó hoạt động. Vì vậy, nếu bạn đang sử dụng USERENA_WITHOUT_USERNAMES, hãy phân lớp một biểu mẫu khác nếu bạn muốn thay đổi biểu mẫu đăng ký.

Tôi nhận ra điều này không trả lời câu hỏi này (chính xác), nhưng, nó kinda không :-)

-g