内联表单添加错误的形式 [英] Inline formset adding wrong form

查看:164
本文介绍了内联表单添加错误的形式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个表单和两个内联表单。

当我想添加 photo_form 实际上 doctors_form 被添加,但如果我交换 photo_form fieldset和 doctor_form html中的字段集 - 一切都很完美!有什么神奇的东西?



forms.py

  class InstitutionForm(forms.ModelForm):

class Meta:
model = Institution
fields ='__all__'
error_css_class ='error'
required_css_class ='required'

def __init __(self,* args,** kwargs):
super(InstitutionForm,self).__ init __(* args,** kwargs)
self.helper = FormHelper()
self.helper.form_tag = False

InstitutionDoctorsFormSet = inlineformset_factory(Institution,Doctor,form = InstitutionForm,extra = 1)
InstitutionPhotosFromSet = inlineformset_factory (Institution,Photo,form = InstitutionForm,extra = 1)

views.py

  def institution_create(request):
if request.POST:
form = InstitutionForm(request.POST,request.FILES)
doctor_form = InstitutionDoctorsFormSet(request.POST,reque st.FILES)
photo_form = InstitutionPhotosFormSet(request.POST,request.FILES)
如果form.is_valid()和doctor_form.is_valid()和photo_form.is_valid():
form.save ()
doctor_form.instance = form.save()
doctor_form.save()
photo_form.instance = form.save()
photo_form.save()
return redirect('base:institutions_list')
else:
form = InstitutionForm()
doctor_form = InstitutionDoctorsFormSet()
photo_form = InstitutionPhotosFormSet()

args = {}
args.update(csrf(request))

args ['form'] = form
args ['doctor_form'] = doctor_form
args ['photo_form'] = photo_form
full_name = request.user.username

return render(request,'base / create_institution.html',localals())

html

 < form CLA ss =the_formenctype =multipart / form-dataaction =。方法= POST > 
{%csrf_token%}
{%crispy form%}
{%wysiwyg_editorid_services%}
{%wysiwyg_editorid_license_text%}
{%wysiwyg_editor id_schedule%}
< fieldset>
< legend>照片< / legend>
{{photo_form.management_form}}
{{photo_form.non_form_errors}}
{%for photo_form%}
{{form.id}}
< ; div class =inline {{photo_form.prefix}}>
{%crispy form%}
< / div>
{%endfor%}
< / fieldset>
< fieldset>
< legend>医生< / legend>
{{doctor_form.management_form}}
{{doctor_form.non_form_errors}}
{%for doctor_form%}
{{form.id}}
< ; div class =inline {{doctor_form.prefix}}>
{%crispy form%}
< br />
< br />
< / div>
{%endfor%}
< / fieldset>
< div class =text-center>
< input class =btn btn-defaulttype =submitname =submitvalue =Создать/>
< a class =btn btn-dangerhref =/ home />取消< / a>
< / div>
< / form>

我尝试删除脆弱的表单使用,但是所有内容都保持不变。



更新:

  class Institution(models.Model):
category = models。 ForeignKey(Category,verbose_name =Категория)
logo = ResizedImageField(size = [320,320],crop = ['middle','center'],quality = 90,upload_to ='logos',verbose_name = Логотип)
name = models.CharField(max_length = 255,verbose_name =Название)
short_description = models.CharField(max_length = 255,verbose_name =Описание)
services = models.TextField(verbose_name =Услуги)
license_text = models.TextField(blank = True,verbose_name =Лицензия)
license_photo = models.ImageField(blank = True,verbose_name =Фотолицензии )
actions = models.CharField(max_length = 255,verbose_name =Акции)
schedule = models.TextField(max_length = 255,verbose_name =Ра
phone = models.CharField(max_length = 255,verbose_name =Телефон)
email = models.CharField(max_length = 255,verbose_name =Почта)
address = models .CharField(max_length = 255,verbose_name =Адрес)
coordinates = models.CharField(default =,max_length = 255,verbose_name =Координаты)
website = models.CharField(max_length = 255,verbose_name =Сайт)

class Meta:
verbose_name = uЗаведение
verbose_name_plural = uЗаведения

def __unicode __自己):
return self.name

class照片(models.Model):
photo = ResizedImageField(size = [600,600],crop = ['middle' 'center'],quality = 90,upload_to ='institution_photos',verbose_name =Фото)
rel_institution = models.ForeignKey(Institution)

class Meta:
verbose_name = uФото
verbose_name_plural = u ото



class Doctor(models.Model):
name = models.CharField(max_length = 255,verbose_name =ФИО)
doctor_photo = ResizedImageField(size = [400,600],crop = ['middle','center'],quality = 90,upload_to ='doctors_photos',verbose_name =Фото)
specs = models.CharField max_length = 1000,verbose_name =Специализация)
experience = models.CharField(max_length = 255,verbose_name =Стажработы)
制度= models.TextField(默认=,verbose_name =Режим работы)
doctor_to_home = models.BooleanField(verbose_name =Возможностьвызованадом)
rel_institution = models.ForeignKey(Institution)

class Meta:
verbose_name = uВрач
verbose_name_plural = uВрачи

def __unicode __(self):
return self.name
pre>

解决方案

我发现ap roblem。这是脚本。没有 formCssClass 参数。
因此脚本应如下所示:

 code>< script type =text / javascript> 
$(function(){
$(。inline。{{doctor_form.prefix}})。formset({
prefix:{{doctor_form.prefix}},
formCssClass:'dynamic-formset1'
});
$(。inline。{{photo_form.prefix}})。formset({
prefix:{{photo_form .prefix}},
formCssClass:'dynamic-formset2'
})
})
< / script>


I have a form and two inline formsets.
When I want to add photo_form actually doctors_form is added, but if I swap photo_form fieldset and doctor_form fieldset in html - everything works perfectly! What magic is going on?!

forms.py

class InstitutionForm(forms.ModelForm):

    class Meta:
        model = Institution
        fields = '__all__'
        error_css_class = 'error'
        required_css_class = 'required'

    def __init__(self, *args, **kwargs):
        super(InstitutionForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_tag = False

InstitutionDoctorsFormSet = inlineformset_factory(Institution, Doctor, form=InstitutionForm, extra=1)
InstitutionPhotosFromSet = inlineformset_factory(Institution, Photo, form=InstitutionForm,  extra=1)

views.py

def institution_create(request):
    if request.POST:
        form = InstitutionForm(request.POST, request.FILES)
        doctor_form = InstitutionDoctorsFormSet(request.POST, request.FILES)
        photo_form = InstitutionPhotosFormSet(request.POST, request.FILES)
        if form.is_valid() and doctor_form.is_valid() and photo_form.is_valid():
            form.save()
            doctor_form.instance = form.save()
            doctor_form.save()
            photo_form.instance = form.save()
            photo_form.save()
            return redirect('base:institutions_list')
    else:
        form = InstitutionForm()
        doctor_form = InstitutionDoctorsFormSet()
        photo_form = InstitutionPhotosFormSet()

    args = {}
    args.update(csrf(request))

    args['form'] = form
    args['doctor_form'] = doctor_form
    args['photo_form'] = photo_form
    full_name = request.user.username

    return render(request, 'base/create_institution.html', locals())

html

<form class="the_form" enctype="multipart/form-data" action="." method="post">
    {% csrf_token %}
    {% crispy form  %}
    {% wysiwyg_editor "id_services" %}
    {% wysiwyg_editor "id_license_text" %}
    {% wysiwyg_editor "id_schedule" %}
    <fieldset>
        <legend>Photos</legend>
        {{ photo_form.management_form }}
        {{ photo_form.non_form_errors }}
        {% for form in photo_form %}
            {{ form.id }}
            <div class="inline {{ photo_form.prefix }}">
                {% crispy form  %}
            </div>
        {% endfor %}
    </fieldset>
    <fieldset>
        <legend>Doctors</legend>
        {{ doctor_form.management_form }}
        {{ doctor_form.non_form_errors }}
        {% for form in doctor_form %}
            {{ form.id }}
            <div class="inline {{ doctor_form.prefix }}">
                 {% crispy form  %}
            <br/>
            <br/>
            </div>
        {% endfor %}
    </fieldset>
    <div class="text-center">
        <input class="btn btn-default" type="submit" name="submit" value="Создать"/>
        <a class="btn btn-danger" href="/home/">Cancel</a>
    </div>
</form>

I tried to remove crispy form usage, but everythings is left same.

Update:

class Institution(models.Model):
    category = models.ForeignKey(Category, verbose_name="Категория")
    logo = ResizedImageField(size=[320, 320], crop=['middle', 'center'], quality=90, upload_to='logos', verbose_name="Логотип")
    name = models.CharField(max_length=255, verbose_name="Название")
    short_description = models.CharField(max_length=255, verbose_name="Описание")
    services = models.TextField(verbose_name="Услуги")
    license_text = models.TextField(blank=True, verbose_name="Лицензия")
    license_photo = models.ImageField(blank=True, verbose_name="Фото лицензии")
    actions = models.CharField(max_length=255, verbose_name="Акции")
    schedule = models.TextField(max_length=255, verbose_name="Расписание")
    phone = models.CharField(max_length=255, verbose_name="Телефон")
    email = models.CharField(max_length=255, verbose_name="Почта")
    address = models.CharField(max_length=255, verbose_name="Адрес")
    coordinates = models.CharField(default="", max_length=255, verbose_name="Координаты")
    website = models.CharField(max_length=255, verbose_name="Сайт")

    class Meta:
        verbose_name = u"Заведение"
        verbose_name_plural = u"Заведения"

    def __unicode__(self):
        return self.name

class Photo(models.Model):
    photo = ResizedImageField(size=[600, 600], crop=['middle', 'center'], quality=90, upload_to='institution_photos', verbose_name="Фото")
    rel_institution = models.ForeignKey(Institution)

    class Meta:
        verbose_name = u"Фото"
        verbose_name_plural = u"Фото"



class Doctor(models.Model):
    name = models.CharField(max_length=255, verbose_name="ФИО")
    doctor_photo = ResizedImageField(size=[400, 600], crop=['middle', 'center'], quality=90, upload_to='doctors_photos', verbose_name="Фото")
    specs = models.CharField(max_length=1000, verbose_name="Специализация")
    experience = models.CharField(max_length=255, verbose_name="Стаж работы")
    regime = models.TextField(default="", verbose_name="Режим работы")
    doctor_to_home = models.BooleanField(verbose_name="Возможность вызова на дом")
    rel_institution = models.ForeignKey(Institution)

    class Meta:
        verbose_name = u"Врач"
        verbose_name_plural = u"Врачи"

    def __unicode__(self):
        return self.name

解决方案

I found a problem. It was in script. There was no formCssClass parameter.
So the script should look like this:

<script type="text/javascript">
    $(function () {
        $(".inline.{{ doctor_form.prefix }}").formset({
            prefix: "{{ doctor_form.prefix }}",
            formCssClass: 'dynamic-formset1'
        });
        $(".inline.{{ photo_form.prefix }}").formset({
            prefix: "{{ photo_form.prefix }}",
            formCssClass: 'dynamic-formset2'
        })
    })
</script>

这篇关于内联表单添加错误的形式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆