2010-12-13 19 views
2

私は、ユーザーに新しいグループを作成したり、既存の "Group"オブジェクトを編集する機会を与えるModelFormを持っています。既存の「編集」が要求されている場合は、フォームデータに既存の情報をあらかじめ入力しておく必要があります。ユーザーが既存のオブジェクトの編集を「保存」すると、次のエラーが表示されます。django ModelForm "unique = True"

「この名前のグループは既に存在します」

同じ名前の新しいオブジェクトを作成するのではなく、オブジェクトを「更新」するようにDjangoに指示するにはどうすればよいですか?

MODEL

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) 

VIEW

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, }) 

答えて

1

あなたが救うアクションでextiningグループオブジェクトを取得する必要があり、それにフォームを結合しました。

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, }) 
+0

非常にいいです、助けてくれてありがとう。私は上記のコードで "save()は正確に2つの引数(1が与えられます)"というエラーが発生します。 – nnachefski

+0

休憩スタイルのURLを使用する場合は、urls.pyを編集してグループIDを渡す必要があります。たとえば、 "/ groups/save/20"と入力すると、20のグループが保存されます。urlパターンは次のようなものです:url(r '^ group/save /(?p \ d +)/ $、name = "group_save" )。あるいは、要求オブジェクトからグループIDを取得し、2番目の引数を削除することもできます。 –

関連する問題