2012-01-05 24 views
5

Tôi đang sử dụng SelectDateWidget với đăng ký django để lưu Ngày sinh khi đăng ký. Tôi đã thử loại trừ ngày sinh và tiểu sử được tạo và lưu với dữ liệu bổ sung. Tôi không hoàn toàn chắc chắn rằng mọi thứ đang đi sai.Django SelectDateWidget không lưu ngày

models.py

class Profile(models.Model): 
    ... 
    dob = models.DateField(_('birthday')) 

forms.py

from django.forms.extras.widgets import SelectDateWidget 

class ProfileRegistration(RegistrationFormTermsOfService): 
    ... 
    dob = forms.DateField(widget=SelectDateWidget(years=range(1999,1939,-1)), 
          label=_("Birthday"), 
         ) 

prifilebackend.py

from registration.forms import RegistrationForm 
from registration.models import RegistrationProfile 

    ... 
    class Backend(default.DefaultBackend): 
     ... 
     p = Profile.objects.get(user=new_user) 
     p.dob=kwargs['dob'] 
     p.save() 

Các lỗi tôi nhận được khi đăng ký sử dụng là: profile_profile.dob có thể không là NULL

Dữ liệu bài đăng được tạo ra dob_day, dob_month và dob_year. tôi đã cố gắng làm sạch dữ liệu nhưng không có kết quả. Bất kỳ sự trợ giúp nào cũng sẽ được đánh giá cao.

quyết:

profilebackend.py

signals.user_registered.send(sender=self.__class__, 
            user=new_user, 
            request=request) 

     u = User.objects.get(username=new_user.username) 
     u.first_name = kwargs['first_name'] 
     u.last_name = kwargs['last_name'] 

     gender = kwargs['gender'] 
     dob = kwargs['dob'] 

     p = Profile(user = new_user, gender = gender, dob = dob) 
     p.save() 
     u.save() 

Trả lời

5

Các cleaned data từ bound form dụ nên bao gồm các đối tượng ngày tháng chính xác, nếu hình thức không có lỗi.

Sử dụng đối tượng ngày này để gán nó vào p.dob

Tôi hoàn toàn không có được cách bạn xử lý đơn đăng ký của bạn, nhưng nói chung nó hoạt động như thế này: Sau khi biểu mẫu được gửi bởi người sử dụng, bạn tạo một hình thức ràng buộc, đảm bảo nó hợp lệ và sau đó truy cập dữ liệu biểu mẫu đã được làm sạch. Một cái gì đó như thế này:

# forms.py 
... 
class RegistrationForm(forms.Form): 
    ... 
    dob = forms.DateField(widget=widgets.SelectDateWidget()) 

# views.py 
... 
def myform_view(request): 
    ... 
    if request.POST: 
     form = RegistrationForm(request.POST) 
     if form.is_valid(): 
      dob = form.cleaned_data.get('dob') 
      # dob is now a python date object 
      do_something_with_birthday(dob) 

Nếu đối tượng dob ngày vẫn là None hoặc sản phẩm nào khi cố gắng cứu nó bằng cách sử backend của bạn, tôi muốn đề nghị bạn bắt đầu gỡ lỗi mã của bạn. Bạn có thể cài đặt django_extensions và chạy một máy chủ phát triển với ./manage.py runserver_plus để có được một dấu vết ngăn xếp tương tác tốt đẹp của ngoại lệ này. Ngoài ra, bạn cũng có thể gỡ lỗi code with pdb của mình.

+0

Tôi đang sử dụng chương trình phụ trợ tùy chỉnh và tôi đã có thể lưu first_name và last_name. như sau: 'def clean_dob (self): \t \t dob = self.cleaned_data.get ('dob') \t \t in dob' trong forms.py của tôi là in ngày theo đúng định dạng trước khi xảy ra lỗi. Vẫn còn như vậy giải pháp. –

+0

Vui lòng xem ghi chú gỡ lỗi ở cuối câu trả lời của tôi. – Haes

+0

Cảm ơn bạn rất nhiều cho lời khuyên của bạn tiết kiệm trong backend đã làm các trick. Xem ở trên cho giải pháp của tôi. Tôi đã cố gắng tránh tùy chỉnh chế độ xem. Tôi không thấy lý do gì cả. –

Các vấn đề liên quan