标签: formset

form.is_valid()为false时如何访问数据

当我有一个有效的Django表单时,我可以使用form.cleaned_data访问数据.但是,当表单无效时,如何获取用户输入的数据,即form.is_valid为false.

我正在尝试访问表单集中的表单,因此form.data似乎只是给我一个烂摊子.

python forms django cleaned-data formset

48
推荐指数
5
解决办法
4万
查看次数

Django:使用实例初始化自定义表单的FormSet

鉴于以下型号:

class Graph(models.Model):
    owner = models.ForeignKey(User)

    def __unicode__(self):
        return u'%d' % self.id

class Point(models.Model):
    graph = models.ForeignKey(Graph) 
    date  = models.DateField(primary_key = True)
    abs   = models.FloatField(null = True)
    avg   = models.FloatField(null = True)

    def __unicode__(self):
        return u'%s' % self.date
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个用于编辑Points列表的表单.HTML输入标记需要设置其他属性,因此我使用以下自定义表单:

class PointForm(forms.ModelForm):
    graph = forms.ModelChoiceField(queryset = Graph.objects.all(),
                                   widget   = forms.HiddenInput())
    date  = forms.DateField(widget = forms.HiddenInput(), label = 'date')
    abs   = forms.FloatField(widget = forms.TextInput(
                                      attrs = {'class': 'abs-field'}),
                            required = False)

    class Meta:
        model  = Point
        fields = ('graph', 'date', 'abs')  # …
Run Code Online (Sandbox Code Playgroud)

forms django instance formset

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

Django formset单元测试

我无法使用formset运行Unit Test.

我尝试做一个测试:

class NewClientTestCase(TestCase):

    def setUp(self):
        self.c = Client()

    def test_0_create_individual_with_same_adress(self):

        post_data =  {
            'ctype': User.CONTACT_INDIVIDUAL,
            'username': 'dupond.f',        
            'email': 'new@gmail.com', 
            'password': 'pwd', 
            'password2': 'pwd', 
            'civility': User.CIVILITY_MISTER, 
            'first_name': 'François', 
            'last_name': 'DUPOND', 
            'phone': '+33 1 34 12 52 30', 
            'gsm': '+33 6 34 12 52 30', 
            'fax': '+33 1 34 12 52 30', 
            'form-0-address1': '33 avenue Gambetta', 
            'form-0-address2': 'apt 50', 
            'form-0-zip_code': '75020', 
            'form-0-city': 'Paris', 
            'form-0-country': 'FRA', 
            'same_for_billing': True,            
        }

        response = self.c.post(reverse('client:full_account'), post_data, follow=True)   

        self.assertRedirects(response, '%s?created=1' % reverse('client:dashboard'))
Run Code Online (Sandbox Code Playgroud)

我有这个错误:

ValidationError:[u'ManagementForm数据丢失或被篡改']

我的看法 …

django unit-testing formset

22
推荐指数
3
解决办法
9174
查看次数

Django:禁止在GenericStackedInline上使用can_delete

我已经构建了这个包含通用外键的模型:

class MyModel(models.Model):
    content_type = models.ForeignKey(ContentType, verbose_name=_('content type'))
    object_id = models.PositiveIntegerField(_('object id'))
    content_object = generic.GenericForeignKey('content_type', 'object_id')
Run Code Online (Sandbox Code Playgroud)

接下来我制作了一个通用的堆叠内联,将它放在任何ModelAmin类中:

class MyModelStackedInline(generic.GenericStackedInline):
    model = MyModel
    formset = generic.generic_inlineformset_factory(MyModel, can_delete=False)
    extra = 0

class SomeOhterModelAdmin(admin.ModelAdmin):
    inlines = [MyModelStackedInline]
Run Code Online (Sandbox Code Playgroud)

但是,尽管delete=False在generic_inlineformset_factory中传递了can_ arg ,但我总是Delete在管理员change_form中看到一个复选框.

这是一个例子:http://img8.imageshack.us/img8/3323/screenshotbe.png

你知道如何删除这个复选框?

谢谢 :)

python generics django django-admin formset

21
推荐指数
2
解决办法
4703
查看次数

Django Formset.is_valid()没有额外的表单

在我的Django应用程序应用程序中,我有一个从简单(非模型)形式创建的formset,其中extra = 1(以允许javasript稍后添加更多表单).

class SomeForm(forms.Form):
    #some fields with required=False
    length = forms.IntegerField(required=False)

    # An example of one of the fields with choices i have
    A = 0
    B = 1
    C = 2
    D = 3

    choices = ((A, 'Aah'), (B, 'Baa'), (C, 'Caa'), (D, 'Daa'))

    # This is a required choice field
    pickme = forms.ChoiceField(choices=choices)


SomeFormset = formset_factory(SomeForm, can_delete=True, extra=1)
Run Code Online (Sandbox Code Playgroud)

现在,当我创建并尝试在我的POST请求视图中验证它时:

my_formset = SomeFormset(request.POST, request.FILES)

if(my_formset.is_valid()):
    # FAIL
Run Code Online (Sandbox Code Playgroud)

如果额外呈现的表单被提交为空,则它始终未通过上述检查.

如果我检查form.changed_data最后一个空的额外表格,我会得到有选择的字段(如上面的pickme).换句话说,当需要某些选项字段时,formset不够聪明,无法确定应忽略空提交的表单.

django django-forms formset

15
推荐指数
2
解决办法
8839
查看次数

Django和空formset是有效的

我对formset有点问题.

我必须在页面中显示多个formset,每个formset都有几种形式.所以我做了类似的事情:

#GET
for prod in products:
     ProductFormSet = modelformset_factory(Product,exclude=('date',),extra=prod.amount)
     formsset.append(ProductFormSet(prefix="prod_%d"%prod.pk))

#POST
for prod in products:
     ProductFormSet = modelformset_factory(Product,exclude=('date',),extra=prod.amount)
     formsset.append(ProductFormSet(request.POST,prefix="prod_%d"%prod.pk))
Run Code Online (Sandbox Code Playgroud)

问题是,当我提交页面时,空帐表单"自动"有效(没有检查),但是如果我在一个表单中填写一个字段,则检查对其起作用.

我不知道为什么,所以如果有人有想法,

谢谢.

python django formset

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

Django formset_factory vs模型formset_factory vs inlineformset_factory

在Django中,表单可能很复杂。表单集可以使您想退出Django。我在那个时候。

有哪些不同的用例,以及要使用哪些用例的注意事项?

我正在寻找有关何时使用每个工厂的更好的指导,因为它们似乎取决于您何时知道什么类型的表单,字段以及是否要创建,编辑或删除(单个表单完全或单独)。父模型)。我已经阅读了许多演练,但是正在努力查看大图,尤其是当我尝试从基于函数的视图转换为基于类的视图时。

以下是一些带有假设/限制的伪代码,可帮助您帮助我理解不同之处。提供伪代码可能会有所帮助,例如哪种类型的表单(ModelForm或常规)与Formset一起使用,或者应该pop从表单中获取什么,因为这似乎是创建具有关系的表单的趋势。

假设您有一些模型:

class Dish(models.Model):
    name = models.CharField(max_length=50)


class Meal(models.Model):
    name = models.CharField(max_length=50)
    dishes = models.ManyToManyField(Dish,
                                    # through='OPTIIONALMealDishIntermediaryClassTable',
                                    related_name="meal")

class Reservation(models.Model):
    date = models.DateTimeField()
    greeting = models.CharField(max_length=255)
    meal = models.OneToOneField(Meal, on_delete=models.CASCADE)


class MealPhotos(models.Model):
    photo = models.OneToOneField(Photo, on_delete=models.CASCADE, related_name='mealPhoto')
    meal = models.ForeignKey(Meal, on_delete=models.CASCADE)
    # optional, so a photo can be attached to a dish if the picture is just of the dish
    dish = models.ForeignKey(Dish, blank=True, null=True, on_delete=models.CASCADE)
Run Code Online (Sandbox Code Playgroud)

您想创建一个new Meal,同时要发送一个Reservation

  • 您将使用哪个工厂?
  • 是否取决于表格是否全部ModelForms?(这意味着你将如何手柄assignming了 …

django django-forms formset inline-formset

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

Django REST框架:在ModelViewSet中保存相关模型

我正试图弄清楚如何使用Django REST框架保存相关模型.在我的应用程序中,我有一个模型Recipe与2相关模型:RecipeIngredientRecipeStep.一个Recipe对象必须至少有3个相关的RecipeIngredient和3个RecipeStep.在引入REST框架之前,我使用了一个CreateView带有两个formset 的Django ,并且保存过程如下(遵循代码form_valid()):

def save_formsets(self, recipe):
    for f in self.get_formsets():
        f.instance = recipe
        f.save()

def save(self, form):
    with transaction.atomic():
        recipe = form.save()
        self.save_formsets(recipe)
    return recipe

def formsets_are_valid(self):
        return all(f.is_valid() for f in self.get_formsets())

def form_valid(self, form):
    try:
        if self.formsets_are_valid():
            try:
                return self.create_ajax_success_response(form)
            except IntegrityError as ie:
                return self.create_ajax_error_response(form, {'IntegrityError': ie.message})
    except ValidationError as ve:
        return self.create_ajax_error_response(form, {'ValidationError': ve.message})
    return self.create_ajax_error_response(form)
Run Code Online (Sandbox Code Playgroud)

现在我有了RecipeViewSet: …

django django-forms formset django-rest-framework

10
推荐指数
1
解决办法
5003
查看次数

使用新的"虚拟"列保存基于类的视图formset项

我在表单中有一个表格,由formset生成.

在这种情况下,我的问题是在修改其中一个项目之后保存所有项目,添加一个新的"虚拟"列作为其他两个的总和(仅在显示表时生成,未保存).我尝试了不同的方法,但没有人工作.

问题:

  • save根本不起作用.当它只是一种形式时它起作用,但不适用于形式
  • 我想,以产生列amount作为Sumbox_onebox_two没有成功.我也试过这种方式生成表单,但这不起作用:
formset = modelformset_factory(
    Item, form=ItemForm)(queryset=Item.objects.order_by(
        'code__name').annotate(amount=Sum('box_one') + Sum('box_two')))
Run Code Online (Sandbox Code Playgroud)

此问题与前一个问题有关,但这个新问题更简单: 使用Django从数据库预填充HTML表单表

StackOverflow以前的相关问题很老,对我不起作用.

我正在使用Django 2.0.2

任何帮助,将不胜感激.提前致谢.

当前代码:

models.py

class Code(models.Model):
    name = models.CharField(max_length=6)
    description = models.CharField(max_length=100)

    def __str__(self):
        return self.name

class Item(models.Model):
    code = models.ForeignKey(Code, on_delete=models.DO_NOTHING)
    box_one = models.IntegerField(default=0)
    box_two = models.IntegerField(default=0)

    class Meta:
        ordering = ["code"]
Run Code Online (Sandbox Code Playgroud)

views.py

class ItemForm(ModelForm):
    description = CharField()

    class Meta:
        model = Item
        fields = ['code', 'box_one', 'box_two']

    def save(self, commit=True): …
Run Code Online (Sandbox Code Playgroud)

python django save formset

10
推荐指数
1
解决办法
240
查看次数

使用内联在前端启用Django管理功能

我决定将我的管理网站的一些功能移到前端.功能包括使用一些外键内联管理一个模型.

为此,我已经安装了django-dynamic-formset JQuery插件(链接git)并且已经挣扎了几天.这是其中一个问题.

Django管理员已经实现了相同的功能.我可以根据需要添加,修改,删除内联和修改模型实例.我想知道为什么我应该使用这个JQuery插件,为什么在互联网上没有这么多关于这个主题的好教程?

我需要一个很好的最近的例子,说明如何在没有第三方JS文件的情况下在前端使用django formsets或inline formsets.如果它有链接(不是复选框)来删除内联项并添加将正确添加新内联的按钮,我会很高兴.

更具体一点,因为这个问题被认为过于宽泛:

我有两个模型School和SchoolPlace:

class School(models.Model):
     name = models.CharField(_('School name'), max_length=100)

class SchoolPlace(models.Model):

    school = models.ForeignKey(School, verbose_name=_('school place'), related_name='school_places', blank=True, null=True)

    name = models.CharField(_('School place name'), max_length=200)

    city = models.ForeignKey(City, blank=True, null=True, verbose_name=_('city'),
                     help_text='city')
Run Code Online (Sandbox Code Playgroud)

还有相应的形式:

class SchoolForm(forms.ModelForm):

      name = forms.CharField(
                             label=_('Name'),
                             widget=forms.TextInput(attrs={
                                'placeholder': _('school name')}),
                              max_length=100, required=True)

class SchoolPlaceForm(forms.ModelForm):

    name = forms.CharField(label=_('Name'),
                            widget=forms.TextInput(
                                        attrs={'placeholder': _('school place name')}),
                                        max_length=200,
                                        required=False)

    city = forms.ModelChoiceField(label=_('City'),
                                  widget=forms.Select(attrs={'class': 'ui search dropdown'}),
                                  queryset=City.objects.all(), required=False)

    class Meta:
        model …
Run Code Online (Sandbox Code Playgroud)

python django django-admin formset inline-formset

9
推荐指数
1
解决办法
707
查看次数