标签: formsets

你会如何在Django中制作动态的formset?

这是我做的方式:

{{ formset.management_form }}
<table>
    {% for form in formset.forms %}
        {{ form }}
    {% endfor %}
</table>
<a href="javascript:void(0)" id="add_form">Add Form</a>   
Run Code Online (Sandbox Code Playgroud)

这是JS:

var form_count = {{formset.total_form_count}};
$('#add_form').click(function() {
    form_count++;
    var form = '{{formset.empty_form|escapejs}}'.replace(/__prefix__/g, form_count);
    $('#forms').append(form)
    $('#id_form-TOTAL_FORMS').val(form_count);
});
Run Code Online (Sandbox Code Playgroud)

特别困扰我的是我必须自己编写escapejs模板标签.它只是删除所有换行符并转义任何单引号,这样它就不会弄乱我的字符串.但Django制造商到底希望我们在这种情况下做些什么呢?为什么他们有这个TOTAL_FORMS隐藏的领域,当他们刚刚使用了一个数组<input name="my_form_field[0]" />然后计算它的长度?

javascript django formsets

18
推荐指数
1
解决办法
2万
查看次数

尝试将QuerySet作为初始数据传递给formset

我正在尝试为库存系统构建一个页面,允许用户更新收到的项目数量.

我想显示所有产品的表格,让用户输入收到的数量,我将发布并迭代以更新数据库.

这是我的观点:

def new_shipment(request):
    list_of_active_products = Product.objects.filter(status=1)
    ShipmentFormSet = formset_factory(ShipmentForm, extra=0)
    formset = ShipmentFormSet(initial=list_of_active_products)
    return render_to_response('inventory/new_shipment.html', {'formset': formset})
Run Code Online (Sandbox Code Playgroud)

这是我的表格模型:

class ShipmentForm(forms.Form):
    sku = forms.IntegerField()
    product_name = forms.CharField(max_length=100)
    quantity = forms.IntegerField()
Run Code Online (Sandbox Code Playgroud)

这是表单模板:

<form method="post" action="">
    <table>
        {% for form in formset %}
    {{ form }}
    {% endfor %}
    </table>    
    <input type="submit" />
</form>
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

渲染时捕获AttributeError:'Product'对象没有属性'get'

任何人都可以帮我解决这个问题吗?

django formsets

13
推荐指数
2
解决办法
1万
查看次数

当使用外键链接保存modelForms时,Django的ManagementForm数据丢失或被篡改

我对Django很新,所以这可能是一个简单的问题.我有2个modelForms,其中有一个ForeignKey到另一个.我的主要目标是保存指标与疾病(FK)的链接,这样对于特定疾病,您可以有多个指标.

使用下面的代码,当我点击"管理框架数据丢失或被篡改"提交时,我收到错误.另外,views.py中的代码似乎没有在返回HttpResponseRedirect的第3个'if'语句中进行验证.但是,当我检查我的数据库时,表单中的值已被写入.有关错误原因的任何想法?以及如何解决它?

我的代码如下:

models.py

#Table for Disease
class Disease(models.Model):
    disease = models.CharField(max_length=300)

#Tables for Indicators
class Indicator(models.Model):
    relevantdisease = models.ForeignKey(Disease)       
    indicator = models.CharField(max_length=300)
Run Code Online (Sandbox Code Playgroud)

forms.py

class DiseaseForm(forms.ModelForm):
    class Meta:
      model = Disease

class IndicatorForm(forms.ModelForm):
    class Meta:
      model = Indicator

DiseaseFormSet = inlineformset_factory(Disease, 
    Indicator,
    can_delete=False,
    form=DiseaseForm)
Run Code Online (Sandbox Code Playgroud)

views.py

def drui(request):

    if request.method == "POST":

       indicatorForm  = IndicatorForm(request.POST)

       if indicatorForm.is_valid():
          new_indicator = indicatorForm.save()
          diseaseInlineFormSet = DiseaseFormSet(request.POST, request.FILES,   instance=new_indicator)

          if diseaseInlineFormSet.is_valid():
             diseaseInlineFormset.save()
             return HttpResponseRedirect('some_url.html')

    else:
       indicatorForm = IndicatorForm()
       diseaseInlineFormSet = DiseaseFormSet()

    return render_to_response("drui.html", {'indicatorForm': indicatorForm, …
Run Code Online (Sandbox Code Playgroud)

html forms django formsets

11
推荐指数
1
解决办法
1万
查看次数

Paginate Django formset

我有一个模型formset,我想使用Django的Paginator一次显示10个表单,但它不能像paginator = Paginator(formset, 10).如果有办法,这样做的正确方法是什么?

python django paginator formsets

7
推荐指数
1
解决办法
4786
查看次数

如何同时提交表单和表单集

我想立刻渲染一个表单和一个formset.formset工作正常(我认为),但表单没有验证(好像没有发布数据)

我试过玩按钮,但它的主要提交功能来自js.

这些表单都是独立工作的,但是在提交给togetehr时却没有,所以看起来这里的问题就是代码:

views.py

from django.shortcuts import render, render_to_response
from django.http import HttpResponseRedirect
from forms import LessonForm, AddMaterialForm
from models import Lesson, SUBJECT_OPTIONS, Materials, MATERIAL_TYPES
from django.forms.formsets import formset_factory

def Create_Lesson(request):
    AddMaterials=formset_factory(AddMaterialForm, extra=9)
    if request.method == "POST": # If the form has been submitted...
        lesson = LessonForm(request.POST, prefix="lesson") # A form bound to the POST data
        formset = AddMaterials(request.POST, request.FILES) # A form bound to the POST data
        if lesson.is_valid() and formset.is_valid(): # All validation rules pass
            lesson = lesson.save(commit=False) …
Run Code Online (Sandbox Code Playgroud)

django django-forms formsets

6
推荐指数
1
解决办法
3451
查看次数

没有使用Django Crispy Forms渲染的Formset的非表单错误

我实现了一个自定义的clean方法来验证我的formset.我知道有错误,因为我可以将它们打印到控制台,但这些non_form_errors()永远不会在我的模板中呈现.我该如何渲染它们?

template.html:

<form action="{% url 'databank:register' %}" method="post" enctype="multipart/form-data">
  {% csrf_token %}

  <div class="container">
    <div class="row" style="margin-top: 30px"> 
      <div class="col-md-10 col-md-offset-1">
        {{ dataset_form.media }}
        {% crispy dataset_form %}
          <div class="authorFormset">
            {% for form in formset %}
              {% crispy form helper %}
            {% endfor %}    
          </div>
        {% crispy terms_form %}
      </div>
    </div>
  </div>

  <div class="container">
    <div class="row">
      <div class="col-md-10 col-md-offset-1">
        <input type="submit" class="btn btn-lg btn-success" value="Submit">
      </div>
    </div>
</div>
{{ formset.management_form }}
Run Code Online (Sandbox Code Playgroud)

forms.py:

class BaseAuthorFormset(BaseFormSet):
    def clean(self):   
        if any(self.errors):
            return
        roles …
Run Code Online (Sandbox Code Playgroud)

django-forms formsets django-crispy-forms

6
推荐指数
2
解决办法
1300
查看次数

保存自定义表单django的formset

我想在django中保存一个formset.为此,我有我的模型和自定义表单.然后我这样创建我的formset:

QuoteFormSet = formset_factory(QuoteForm, extra=2)
formset = QuoteFormset(request.POST)
Run Code Online (Sandbox Code Playgroud)

但是当我做formset.save()时,我得到了 AttributeError: 'QuoteFormFormSet' object has no attribute 'save'

我的模特:

class Quote(models.Model):
    country = models.CharField(max_length=2,)
    street = models.CharField(max_length=100,)
Run Code Online (Sandbox Code Playgroud)

我的表格:

class QuoteForm(forms.ModelForm):
    class Meta:
        model = Quote
    country = forms.ChoiceField(choices=COUNTRIES, required=False)
    street = forms.CharField(max_length=100, required=False)
Run Code Online (Sandbox Code Playgroud)

python django django-models formsets

4
推荐指数
1
解决办法
2077
查看次数

Django:防止在表单集中保存空表单

这应该是一个相当容易的,但我真的很难自己弄清楚。

我正在做一个房地产应用程序,我需要我的用户能够上传他们的房屋图片。每个图像都与一个房子相关,每个房子都与一个用户相关。

它的工作方式是,但是如果用户使用我的表单集提交一个空表单,整个事情就会中断,因为它向用户和房屋注册了一个不存在的图像。我怎样才能防止这种情况?

这是我的观点:

def photos_formset(request, *args, **kwargs):
    pk = kwargs['pk']
    ImovelPhotosModelFormset = modelformset_factory(ImovelPhotos, form=ImovelPhotosForm)
    formset = ImovelPhotosModelFormset(
            request.POST or None, request.FILES or None,
            queryset = Imovel.objects.get(pk=pk).imovelphotos_set.all(),
        )
    if formset.is_valid():
        for form in formset:
            if not request.FILES:
                break
            if form.is_valid():
                obj = form.save(commit=False)
                obj.user = request.user
                obj.imovel = Imovel.objects.get(pk=pk)
                obj.save()
        return HttpResponseRedirect('/lares/{pk}/'.format(pk=pk))

    context = {
        "formset": formset,
    }
    return render(request, "imovel_photos.html", context)
Run Code Online (Sandbox Code Playgroud)

看起来更像是潜在答案的事情是这样的,但它不起作用,如果我这样做,什么也不会发生:

if form.is_valid() and not form.empty_permitted:
Run Code Online (Sandbox Code Playgroud)

django django-forms django-views formsets

3
推荐指数
1
解决办法
1833
查看次数