【问题标题】:django ModelForm "unique=True"django ModelForm“唯一=真”
【发布时间】:2010-12-13 15:15:14
【问题描述】:

我有一个 ModelForm,让用户有机会创建新的或编辑现有的“组”对象。如果请求“编辑”现有信息,我会使用现有信息预先填充表单数据。当用户在现有对象上“保存”编辑时,我收到此错误:

“同名的组已经存在。”

我如何告诉 Django “更新”对象而不是尝试创建一个具有相同名称的新对象?

型号

class Analyst(models.Model):
    first = models.CharField(max_length=32)
    last = models.CharField(max_length=32)
    def __unicode__(self):
        return "%s, %s" % (self.last, self.first)

class Alias(models.Model):
    alias = models.CharField(max_length=32)
    def __unicode__(self):
        return "%s" % (self.alias)

class Octet(models.Model):
    num = models.IntegerField(max_length=3)
    def __unicode__(self):
        return "%s" % (self.num)

class Group(models.Model):
    name = models.CharField(max_length=32, unique=True) #name of the group
    octets = models.ManyToManyField(Octet, blank=True) #not required
    aliases = models.ManyToManyField(Alias, blank=True) #not required
    analyst = models.ForeignKey(Analyst) #analyst assigned to group, required
    def __unicode__(self):
        return "%s" % (self.name)

查看

class GroupEditForm(ModelForm):
    class Meta:
        model = Group

def index(request):
    if request.method == 'GET':
        groups = Group.objects.all().order_by('name')
        return render_to_response('groups.html', 
                                  { 'groups': groups, }, 
                                  context_instance = RequestContext(request),
                                  )

def edit(request):
    if request.method == "POST":
        form = GroupEditForm(instance = Group.objects.get(name=request.POST['name']))
    elif request.method == "GET":
        form = GroupEditForm()

    return render_to_response('group_edit.html',
                             { 'form': form,  },
                             context_instance = RequestContext(request),
                             )

def save(request):
    if request.method == "POST":
        form = GroupEditForm(request.POST)
        if form.is_valid():
            form.save(commit=True)
            return HttpResponseRedirect('/groups/')

    return render_to_response('group_save.html',
                               { 'test': form.errors,  })

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    您必须在保存操作中获取 extining group 对象并将表单绑定到它。

    def save(request, id):
        if request.method == "POST":
           group = get_object_or_404(Group, pk=id)
           form = GroupEditForm(request.POST, instance=group) # A form bound to the POST data
           if form.is_valid():
              form.save(commit=True)
              return HttpResponseRedirect('/groups/')
    
        return render_to_response('group_save.html',
                               { 'test': form.errors,  })
    

    【讨论】:

    • 非常好,感谢您的帮助。现在,上面的代码出现了一个额外的错误“save() 正好需要 2 个参数(1 个给定)”。
    • 如果你想使用 rest 样式的 url,你必须编辑 urls.py 以传递组 ID。例如“/groups/save/20”来保存 id 为 20 的组。url 模式是这样的: url(r'^group/save/(?p\d+)/$, name=" group_save”)。或者,您可以从请求对象中获取组 id 并删除第二个参数。
    猜你喜欢
    • 1970-01-01
    • 2012-06-05
    • 2021-06-07
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 2010-12-02
    相关资源
    最近更新 更多