如何通过ModelForm在Django中编辑m2m [英] How to edit m2m in Django via ModelForm

查看:132
本文介绍了如何通过ModelForm在Django中编辑m2m的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个模型:

class Case(models.Model):
Priority = ( 
                    ('Blocker', 'Blocker'),
                    ('High', 'High'),
                    ('Medium', 'Medium'),
                    ('Low', 'Low'),
            )
id          = models.AutoField(primary_key=True)
name        = models.CharField(max_length=200)
image       = models.URLField(blank=True)
requirements = models.URLField(blank=True)
priority    = models.CharField(max_length=10, choices=Priority)
description = models.CharField(max_length=200)
step        = models.TextField()
modified    = models.DateTimeField(editable=False)
user        = models.ForeignKey(User, editable=False)

def save(self, *args, **kwargs):
    ''' On save, update timestamps '''
    if not self.id:
        self.modified = datetime.datetime.today()
    super(Case, self).save(*args, **kwargs)

def __unicode__(self):
    return self.name
    return self.description

class Suite (models.Model):
    id          = models.AutoField(primary_key=True)
    name        = models.CharField(max_length=200)
    features    = models.TextField()
    modified    = models.DateTimeField(editable=False, null=True)
    cases       = models.ManyToManyField(Case, null=True)
    user        = models.ForeignKey(User, editable=False)

    def save(self, *args, **kwargs):
        ''' On save, update timestamps '''
        if not self.id:
            self.modified = datetime.datetime.today()
        super(Suite, self).save(*args, **kwargs)

    def __unicode__(self):
        return self.name
        return self.description

当我想创建套件或案例时,它工作正常: / p>

When I want to create suite or case it works fine:

def addCase(request):
    c = {}
    c.update(csrf(request))
    user = auth.get_user(request)
    if request.method == 'POST': 
        form = AddCase(data = request.POST) 
        if form.is_valid():
            form.save()
    else:
        form = AddCase() 

    return render_to_response('1.html', {
                                                    'form': form,
                                                    'js': c.items(),
                                                    'host' : request.get_host(),
                                                    'user' : user
                                                })
def addSuite(request):
    c = {}
    c.update(csrf(request))
    user = auth.get_user(request)
    if request.method == 'POST': # If the form has been submitted...
        form = AddSuite(data = request.POST) 
        if form.is_valid():
            form.save()
    else:
        form = AddSuite() 

    return render_to_response('2.html', {
                                                    'form': form,
                                                    'js': c.items(),
                                                    'host' : request.get_host(),
                                                    'user' : user
                                                })

但是当我想编辑这些,我使用下一个视图:

But when I want to edit these, I use next views:

def editSuite (request, suite_id):
    suite = Suite.objects.get(id=suite_id)
    name = suite.name
    features = suite.features
    cases = suite.cases
    c = {}
    c.update(csrf(request))
    if request.method == 'POST': # If the form has been submitted...
        form = EditSuite(data = request.POST) 
        if form.is_valid():
            suite = Suite(
                        id        = suite_id,
                        name      = form.cleaned_data['name'],
                        features  = form.cleaned_data['features'],
                        cases     = request.POST.getlist('cases')
                        )
            suite.save()
#            form.save()
    else:
        form = EditSuite(instance = suite)



    return render_to_response('editsuite.html', {
        'form': form,
        'suite': suite,
        'cases' : request.POST.getlist('cases')
    })

所以,我需要知道如何保存编辑套件。添加工作很好,在管理面板工作确定,但是当我尝试编辑套件,我收到很多不同的错误。管理中的关键时刻运作良好。
谢谢

So, I need to know how to save edited suite. Adding works fine, in admin panel works ok, but when I tried to edit suite, I receive a lot of different errors. The key moment - in admin works well. Thank you

推荐答案

好的,有我的坏要编辑m2m模型表单,您应该使用这样的东西

Ok, there was my bad. To edit m2m model forms you should use something like this

form = EditSuite(request.POST, instance = suite)
    if form.is_valid():
        obj = form.save(commit=False)
        obj.user = request.user
        cases = request.POST.getlist('cases')
        obj.save()
        form.save_m2m()

这篇关于如何通过ModelForm在Django中编辑m2m的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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