我用这个社会注册/注册图书馆django allauth作为我的一个项目.如何自定义默认模板和表单以提供更好的外观和感觉?
django django-templates django-forms django-formwizard django-allauth
我有一个FormWizard,我需要第一个表单中的数据传递给第二个表单的构造函数,以便我可以构建一个动态表单.
我可以通过FormWizard的process_step获取第一个表单的数据.
我使用字段列表的数据库调用创建第二个窗体的字段.
class ConditionWizardDynamicQuestions(forms.Form):
    def __init__(self, DynamicQuestions=None, *args, **kwargs):
       super(ConditionWizardDynamicQuestions, self).__init__(*args, **kwargs)
       questions = Question.objects.filter(MYDATA = DATA_FROM_1STFORM)
       for q in questions:
            dynField = FieldFactory(q)
            self.fields[q.label] = dynField
如何通过DATA_FROM_1STFORM?
我的结果代码:我放弃了表单的init,并将其切换到CreateQuestions def.然后使用向导的get_form覆盖来在创建后更改表单.
class ConditionWizard(SessionFormWizard):
    def get_form(self, request, storage, step=None, data=None, files=None):
        form = super(ConditionWizard, self).get_form(request, storage, step, data, files)
        stepIndex = self.get_step_index(request, storage, step)
        if stepIndex == 1:
            form.CreateQuestions(request.session["WizardConditionId"])
        if stepIndex == 3:
            form.fields['hiddenConditionId'].initial = request.session["WizardConditionId"]
            form.fields['medicationName'].queryset = Medication.objects.filter(condition = request.session["WizardConditionId"])
        return form
所以基本上我想要实现类似Google双因素身份验证实现的东西.我的登录表单包含两步表单向导:
使用场景将是:
我现在将django的表单向导子类化为我的登录视图.在第2步中,默认情况下,Django FormWizard会将以前提交的表单中的字段值包含为隐藏字段.但是如您所知,密码是在步骤1中输入的,因此出于安全原因,我不希望将其包含在步骤2中.
我的第一个想法是使用会话来指示用户是否已通过步骤1,因此我不需要包含步骤1中的字段值..但我可能会忽略这里的某些内容.有什么更安全的解决方案?
另外我不太明白在FormWizard中使用security-hash.谁能解释一下?
非常感谢.
我正在创建一个示例,以了解有关使用SessionWizard的内联表单集的更多信息.最后,我想集成动态表单集,以便在提交之前通过模板添加和删除单个表单.但是,当第二种形式中没有数据时,它不能像常规ModelForm那样进行验证.
SessionWizard中是否有需要覆盖的方法?这是Django内在处理的东西吗?
非常感谢指导和实例.
models.py
class Parent(models.Model):
    name = models.CharField(max_length=256)
    def __unicode__(self):
        return name
class Child(models.Model):
    name = models.CharField(max_length=256)
    parent = models.ForeignKey(Parent)
    def __unicode__(self):
        return name
urls.py
test_forms = [['parent', ParentForm],['child', ChildFormSet]]
urlpatterns = patterns('example.views',
    url(r'^$', TestWizard.as_view(test_forms)),
)
forms.py
class ParentForm(ModelForm):
    class Meta:
        model = Parent
class ChildForm(ModelForm):
    class Meta:
        model = Child
        exclude = ('parent',)
ChildFormSet = inlineformset_factory(Parent, Child, extra=1)
class TestWizard(SessionWizardView):
    """
    This WizardView is used to create multi-page forms and handles all the
    storage and validation stuff using …我有一个场景,我正在尝试计划开始编码,我正在考虑使用django wizard.
我的计划是用两个步骤构建一个django向导,第一个简单但第二个稍微复杂一点.第二步将包含一个表单,该表单将根据从第一步中选择的值进行重新整形,我可以看到自己正在做的事情.我已经探索了所有现有的功能,我认为它可以很容易地完成.
我面临的挑战是第二步本身.我有一个表单和一个formset,formset是一对多的形式(文章 - >图像)所以当到达第二步时,用户将能够将一个或多个图像上传到同一篇文章.
我试图在谷歌邮件列表和stackoverflow上的任何地方搜索,以将一个formset传递给django向导类,但似乎你不能在同一步骤中传递两个表单.
NewItemWizard.as_view([
    ('category',    CategorySelectionForm),
    ('article',        ArticleForm)
])
如上所示,在上面的示例代码中,我希望能够将ArticleForm和ImageFormset传递给第二步.有没有办法开箱即用?
基于我正在阅读的内容,我相信使用像get_context_data这样的函数可能有所帮助,但它会非常hacky.
def get_context_data(self, form, **kwargs):
    context = super(NewItemWizard, self).get_context_data(form=form, **kwargs)
    if self.steps.current == 'article':
        context.update({
            'image_formset': ImageFormset()
        })
    return context
任何人都可以建议更好的方法?
干杯,
我有几个表单已添加到向导中,但表单状态仅在最后一步中保留,并且不执行done().
我已经根据django文档中的示例创建了以下内容,以尝试深入了解这一点.似乎最后一步是唯一一个在步骤之间移动时拯救状态的步骤.
class OneForm( Form ):
    field_one = forms.CharField(label='1', max_length=100)
    field_two = forms.CharField(label='2', max_length=100)
    field_three = forms.CharField(label='3', max_length=100)
class TwoForm( Form ):
    field_one = forms.CharField(label='4', max_length=100)
    field_two = forms.CharField(label='5', max_length=100)
    field_three = forms.CharField(label='6', max_length=100)
TEST_WIZARD_FORMS = [
    ("one", OneForm),
    ("two", TwoForm),
]
TEST_TEMPLATES = {
    'one': 'tour/one.html',
    'two': 'tour/two.html',
}
class TestWizardView( SessionWizardView ):
    form_list = TEST_WIZARD_FORMS
    def done(self, form_list, **kwargs):
        print('done executed')
        return reverse('home')
    def get_template_names(self):
        return [TEST_TEMPLATES[self.steps.current]]
这对于模板(one.html和two.html都相同)
<html>
<body>
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p> …我现在正在努力满足要求,我想在选择字段标签上添加一个图像,我真的不知道如何做到这一点.我正在使用django表单向导来呈现表单.这是显示我想要实现的目标的图像:

这就是我现在所拥有的(使内置单选按钮,我知道它可以通过css实现):

这是forms.py:
from django import forms
from django.utils.translation import gettext as _
CHOICES=[('0','Pay by card'), ('1','Invoice')]
class PaymentForm(forms.Form):
    title = 'payment'
    payment_method = forms.ChoiceField(label = _("Payment Options"), choices=CHOICES, widget=forms.RadioSelect(), required = True)
我使用向导形式渲染:
 {{ wizard.form.payment_method.label_tag }}
                                {{ wizard.form.payment_method|safe }}
                                {{ wizard.form.payment.errors}}
除了自定义小部件之外,任何人都对此有任何建议吗?
我正在使用django(1.4)formwizard作为我的应用程序.在第1步中,我上传了2个文件.这些文件在第二步中使用.一切都工作正常,但这--- ---"当我完成所有步骤或我在第1步后停止我仍然有临时文件存储在MEDIA目录"
如何在任何情况下确保删除这些文件?
我能够动态调用一个与我从step ealier中选择的数据相关的表单.
但是当我在done方法中时,我可以看到我form_list保持不变.
这是我做的:
def get_form_list(request, form_list=None):
    if form_list is None:
        form_list = [ProviderForm, DummyForm, ConsummerForm, DummyForm, \
                 ServicesDescriptionForm]
    return UserServiceWizard.as_view(form_list=form_list)(request)
class UserServiceWizard(SessionWizardView):
    instance = None
    def __init__(self, **kwargs):
        self.form_list = kwargs.pop('form_list')
        return super(UserServiceWizard, self).__init__(**kwargs)
    def get_form_instance(self, step):
        if self.instance is None:
            self.instance = UserService()
        return self.instance
    def get_context_data(self, form, **kwargs):
        data = self.get_cleaned_data_for_step(self.get_prev_step(
                                                    self.steps.current))
        if self.steps.current == '1':
            service_name = str(data['provider']).split('Service')[1]
            form = class_for_name('th_' + service_name.lower() + '.forms',
                                  service_name + 'ProviderForm')
            self.form_list['1'] = …作为我的Django视图中的表单向导的一部分,我使用的是Formset.每个步骤的向导表单都声明如下:
UserFormSet = modelformset_factory(account_models.MyUser,
                                   form=account_forms.MyUserForm, 
                                   extra=5, 
                                   max_num=10, 
                                   can_delete=True)
FORMS = [('userchoice', UserChoiceForm),
         ('user', UserFormSet),]
TEMPLATES = {'userchoice': "account/userchoice.html",
             'user': "account/user.html",}
我想要实现的是:在UserChoiceForm(第一步)中,可以设置所需用户的数量.我想使用此值动态设置UserFormSet上的额外属性,以便在第二步中只显示所需数量的表单.
我试图通过覆盖向导的get_form()方法来做到这一点:
class MyUserWizard(SessionWizardView):
 def get_form(self, step=None, data=None, files=None):
     form = super(MyUserWizard, self).get_form(step, data, files)
     # Determine the step if not given
     if step is None:
         step = self.steps.current
     if step == 'user':
         # Return number of forms for formset requested 
         # in previous step.
         userchoice = self.get_cleaned_data_for_step('userchoice')
         num_users = userchoice['num_users']
         CoFunderFormSet.extra …