Tôi muốn thực hiện một FormWizard 2 phần đơn giản. Mẫu 1 sẽ bằng cách tự động tạo ra một cái gì đó như thế này:Django FormWizard với các hình thức động
class BuyAppleForm(forms.Form):
creditcard = forms.ChoiceField(widget = forms.RadioSelect)
type = forms.ChoiceField(widget = forms.RadioSelect)
def __init__(self,*args, **kwargs):
user = kwargs['user']
del kwargs['user']
super(BuyAppleForm, self).__init__(*args, **kwargs)
credit_cards = get_credit_cards(user)
self.fields['creditcard'].choices = [(card.id,str(card)) for card in credit_cards]
apple_types= get_types_packages()
self.fields['type'].choices = [(type.id,str(type)) for type in apple_types]
này tự động sẽ tạo ra một hình thức với danh sách các lựa chọn có sẵn.
Biểu mẫu thứ hai của tôi, tôi thực sự không muốn nhập liệu. Tôi chỉ muốn hiển thị màn hình xác nhận có chứa thông tin thẻ tín dụng, thông tin về táo và số tiền (tổng cộng, thuế, giao hàng). Khi người dùng nhấp OK, tôi muốn mua táo để bắt đầu.
Tôi đã có thể triển khai cách tạo biểu mẫu đơn bằng cách chuyển trong đối tượng request.user trong kwargs. Tuy nhiên, với FormWizard, tôi không thể hình dung ra điều này.
Tôi có đang tiếp cận vấn đề sai và FormWizard không phải là cách thích hợp để thực hiện việc này không? Nếu có, phương thức Form __init__
có thể truy cập đối tượng người dùng từ yêu cầu HTTP như thế nào?
Thú vị. Cảm ơn vì đã chỉ ra điều đó, Tom. – ayaz
Cảm ơn bạn đã chỉ ra FormPreview. Tuy nhiên, trong trường hợp của tôi, một phần của vấn đề đang chuyển vào một giá trị bổ sung ** kwargs (request.user là 'người dùng') cho __init__ của hàm tạo (cần thiết cho tạo biểu mẫu động), và tôi không thấy cách đó có thể với FormPreview. –
Tôi không chắc liệu nó có giúp ích gì không (với FormPreview), nhưng một số thứ bạn có thể làm trong mã của bạn ở trên không được đặt mã đó vào phương thức __init__. ví dụ. x = BuyAppleForm(), sau đó làm x.set_choices_for_user (request.user) trước khi nó được hiển thị. – Tom