繁体   English   中英

如何测试ModelForm save()方法将更改保存在模型中?

How to test ModelForm save() method saves changes in model?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我已重写AdminModelModelForm使User领域的食用和可保存从Person的管理变化形式。

class Person(models.Model):
    user = models.OneToOneField(User)
    #and also some char, text fields

    @property
    def name(self):
        return self.user.first_name
    @name.setter
    def name(self, value):
        self.user.first_name = value

    #and by analogy surname and email properties


class PersonForm(ModelForm):
    class Meta:
        model = Person

    name = forms.CharField(max_length=100, required=False)
    surname = forms.CharField(max_length=100, required=False)
    email = forms.EmailField(required=False)

    def save(self, commit=True):
        instance = super(PersonForm, self).save(commit)  
        user = instance.user
        user.first_name = self.cleaned_data['name']
        user.last_name = self.cleaned_data['surname']
        user.email = self.cleaned_data['email']
        user.save()
        return instance

class PersonAdmin(admin.ModelAdmin):
    fields = ['name', 'surname', 'email', 'and_others']

    form = PersonForm

admin.site.register(Person, PersonAdmin)

但是我正在努力编写一个检查save()方法的测试:

def test_form_saves_values_to_instance_user_on_save(self):
    """
    test that, form saves name, surname, email values to corresponding User
    when commiting form
    """
    user = User.objects.get(username='admin')
    person = Person.objects.get(user=user)
    personform = PersonForm(instance=person, data={'name': 'has_changed'})

    # if uncommented raisesValueError: The Person could not be changed
    # because the data didn't validate.
    # personform.save()

    self.assertEquals("has_changed", User.objects.get(pk=user.pk).first_name)

更新测试

更新解决方案。 原来,我没有填写所请求的不可见字段“用户”。 排除使表格有效并通过测试。

管理员

class PersonForm(ModelForm):
    class Meta:
        model = Person
        exclude = ('user',)
# ...

tests.py

def test_form_saves_values_to_instance_user_on_save(self):
    """
    test that, form saves name, surname, email values to corresponding User
    when commiting form
    """

    person = Person.objects.get(user__username='admin')
    personform = PersonForm(instance=person, data={'name': 'has_changed'})

    if personform.is_valid():
        person = personform.save()
        self.assertEquals(User.objects.get(pk=person.user.pk).first_name, "has_changed")
    else:
        self.fail("personform not valid")
2 个回复
def test_form_saves_values_to_instance_user_on_save(self):
    """
    test form saves name, surname, email values to corresponding User object
    when commiting form
    """
    person = Person.objects.get(user__username='admin')
    personform = PersonForm(instance=person, data={'name': 'has_changed'})

    if personform.is_valid():
        person = personform.save()
        self.assertEquals(person.user.first_name, "has_changed")
    else:
        self.fail("personform not valid")

我认为您还需要从表单中排除user字段

class PersonForm(ModelForm):
    class Meta:
        model = Person
        exclude = ('user',)
    ...

将新数据作为字典传递到您的表单(作为第一个位置参数或作为data ),并断言personform.cleaned_data['name']等于User.objects.get(pk=user.pk).username 然后对surnameemail执行相同的操作。

请注意, first_namelast_namemax_length为30,而表单字段的max_length为100。

1 更改modelForm保存的模型,保存

假设我有一个父类MyUser的modelForm,其中包含用户的公共信息。 用户有一个名为角色的字段,该字段指示他们在其中扮演什么角色,我为3个角色提供了3个特殊模型。 我想要做的是在保存表单时检查表单的角色字段,如果这是这3种特殊角色之一,则我想保存特殊的Model(它是MyUse ...

2 覆盖ModelForm类中的save方法

我正在尝试在ModelForm类中重写save方法来处理用户输入字段,创建一些表单实例并将其保存到DB。 我有一个包含很多字段的表单,它将无法有效使用表单集。 这就是为什么我希望用户可以在Xfield中输入类似10#15的内容,然后save()将处理Xfield值为10、11、12、13、1 ...

2019-08-25 18:40:19 0 33   django
3 如何为具有ManyToManyField的模型正确覆盖ModelForm的save()方法

考虑一下,我定义了以下模型: 以及以下模型形式: 基本上我有一个带有标签的条目。 标签不一定已经创建。 我需要接收填写的报名表并用标签保存。 如果条目中没有ManyToMany关系,我可以轻松地做到这一点。 但是有了它,我首先需要保存标签,然后将保存的标签添加到条目中 ...

4 laravel模型save()将重复的数据保存在db中

我写了一些从php / laravel视频教程学习的代码。 但是结果不一样。 问题步骤是: 创建一个名为问题的数据库表和一个名为问题的模型。 添加一个将数据保存到数据库的功能。 在此函数中,使用以下代码: 在浏览器http:// localhost / ap ...

5 如何防止在before_save回调中更改保存模型

因此,我必须1)不保存更改,而是2)保存这些更改的审核。 第二部分是通过send_for_audit方法实现的,但是如果我在其中返回false,则不会创建新的Audit实例,也不会保存对Article实例的更改(有简化代码)。 我试图添加一个额外的before_save回调,以为触发它 ...

7 playframework中的save()和_save()模型的方法

当创建playramework的模型时,我们可以使用save()或_save()方法。 为什么这两种方法在框架中都可用,这是什么原因? (在这种情况下,它们执行相同的操作-将对象保存到db)。 我为什么要问这个问题:在其中进行验证时,我已经使用过save()方法,但是如果我的最终用户想 ...

8 CoreData是保存模型,没有调用save:方法

我在导航栏中有一个带有加号按钮的项目列表,这会打开一个包含models属性表的模式窗口,当单击表项时会显示一个表单(相当标准的表单样式)。 由于某种原因,如果我单击加号按钮以打开表单以创建新模型,然后立即单击完成按钮,则将保存人员模型。 链接到完成按钮的动作除了调用委托方法来通知person ...

9 将包含引用到另一个模型的ForeignKey字段的ModelForm保存在Postgresql数据库表中

以下是我的模特 这是我为注册模型创建的ModelForm 当我在模板上运行上述RegistrationForm时,出现以下窗口 注册模型表格的图像 研讨会字段,在注册模型中定义为ForeignKey,在研讨会模型中指的是workshopID。 研讨会出现在预先填写的 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM