2010-01-02 32 views
17

Tôi đang cố gắng tạo biểu mẫu tùy chỉnh django để thay đổi tên người dùng và email người dùng cho một ứng dụng. Đó là lý do tại sao tôi cần chuyển chi tiết người dùng từ phiên này sang biểu mẫu khác để kiểm tra xem người dùng đã đăng nhập có tồn tại hay không. Tôi đang làm theo cách này:Chuyển ** kwargs sang Django Form

trong views.py

personal_info_form = PersonalInfoForm(prefix='personal_info', 
             user_details=user_details) 

nơi user_details là một cuốn từ điển:

'user_details': [{'username': u'username', 
        'registration_date': datetime.date(2009, 10, 22), 
        'id': 13, 'email': u'[email protected]'}]} 

Trong forms.py Tôi có đoạn mã sau:

class PersonalInfoForm(forms.Form): 

    def __init__(self, *args, **kwargs): 
     user_details = kwargs.pop('user_details', None) 
     super(PersonalInfoForm, self).__init__(*args, **kwargs) 

    username = forms.CharField(required=True, initial=user_details[0]['username']) 
    email = forms.EmailField(required=True) 

Và tôi nhận được lỗi sau:

name 'user_details' is not defined 

Tôi đã cố gắng truy cập vào nó với self.user_details và chỉ user_details và nó mang lại cho tôi những lỗi tương tự

Trả lời

29

user_details được chuyển đến __init__, vì vậy không được xác định bên ngoài. Đó là lý do tại sao bạn không thể truy cập nó khi bạn đang instatiating rằng đối tượng CharField. Đặt initial trong __init__ bản thân, sau khi bạn đã popped nó từ kwargs, ví dụ:

class PersonalInfoForm(forms.Form): 

    username = forms.CharField(required=True) 
    email = forms.EmailField(required=True) 

    def __init__(self, *args, **kwargs): 
     user_details = kwargs.pop('user_details', None) 
     super(PersonalInfoForm, self).__init__(*args, **kwargs) 
     if user_details: 
      self.fields['username'].initial = user_details[0]['username'] 

Khi bạn nhận được một cơ hội, hãy cân nhắc đọc lên trên scopes in python.

+1

+1 đẹp. 10 giây trước khi gửi giải pháp rất giống của tôi, biểu ngữ màu da cam bật lên ... được thực hiện độc đáo! – czarchaic

+0

Cảm ơn bạn, tôi đang đọc về phạm vi ngay bây giờ :) –

2

bạn có thể giải thích một cách rõ ràng hơn những gì bạn đang cố gắng để làm gì? Tôi tin rằng những gì bạn đang làm là không cần thiết. Không chắc chắn nếu tôi hiểu bạn, nhưng hãy nhìn vào hình thức Django mẫu: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

>>> from django.forms import ModelForm 

# Create the form class. 
>>> class ArticleForm(ModelForm): 
...  class Meta: 
...   model = Article 

# Creating a form to add an article. 
>>> form = ArticleForm() 

# Creating a form to change an existing article. 
>>> article = Article.objects.get(pk=1) 
>>> form = ArticleForm(instance=article) 

Nếu đó là những gì bạn đang tìm kiếm, bạn có thể dễ dàng addapt sử dụng mô hình người dùng của bạn. Hãy nhớ rằng, bạn có thể chọn trường nào bạn muốn cho phép thay đổi. Tham số instance đặt giá trị trường ban đầu (đó là những gì tôi hiểu bạn muốn làm). Ví dụ trên sẽ hiển thị tất cả các trường, ví dụ dưới đây cho thấy cách hiển thị chỉ 2 trường.

class PartialAuthorForm(ModelForm): 
    class Meta: 
     model = Author 
     fields = ('name', 'title') 

Hy vọng tôi đã giúp.

+0

Tôi đang cố gắng truy cập các biến từ ** kwargs trong lớp Biểu mẫu. –

+1

Bạn đã thử: 'kwargs ['user_details']'? – Clash

+0

Có. Nó mang lại cho tôi tên 'kwargs' không được định nghĩa –

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