2013-03-13 72 views
0

我需要以下代码的帮助。我想我快到了。我正在尝试创建一个用于编辑和添加新对象的视图。但是,在保存时出现下面列出的错误。django查看完整性错误

我不知道是否有人能告诉我我哪里出错了吗?

谢谢。

view.py

def group(request, id=None): 

    if id: 
     group = get_object_or_404(Groups, pk=id) 

    else: 
     group = Groups() 

     # If we had a POST then get the request post values. 
    if request.method == 'POST': 
     form = GroupFrom(request.POST) 
     # Check we have valid data 
     if form.is_valid(): 
      group = Groups(
       name=form.cleaned_data['name'], 
       description=form.cleaned_data['description'], 
       active=form.cleaned_data['active'], 
       user=request.user 
      ) 

      group.save() 

    else: 
     form = GroupFrom(instance=group) 

    context = {'form': form} 
    return render_to_response('contacts/group.html', context, context_instance=RequestContext(request)) 

urls.py

 (r'^group/new/$', 'contacts.views.group', {}, 'group_new'), 
    (r'^group/edit/(?P<id>\d+)/$', 'contacts.views.group', {}, 'group_edit'), 

model.py

class Groups(models.Model): 
    """ 
    Stores all groups. 
    """ 
    name = models.CharField(max_length=60) 
    description = models.TextField(max_length=250) 
    active = models.BooleanField() 
    modified = models.DateTimeField(null=True, auto_now=True, help_text="Shows when object was modified.") 
    created = models.DateTimeField(auto_now_add=True, help_text="Shows when object was created.") 

    #FK 
    user = models.ForeignKey(User, unique=True, related_name="user") 

    def __unicode__(self): 
     return self.name 

错误

IntegrityError在/联系人/组/编辑/ 1/ (1062, “关键 'user_ID的' 重复项 '1'”)

UPDATE: 原来这就是我现在,它的工作原理,但只有在编辑不添加。在添加时我仍然得到了同样的错误:

def group(request, id=None): 

    if id: 
     # If we have an id try and get it and populate instance. 
     group = get_object_or_404(Groups, pk=id) 
     # If we have an instance check that it belongs to the login. 
     if group.user != request.user: 
      return HttpResponseForbidden() 
    else: 
     # If we don't have an id get the instance (which is blank here) and populate it with the user. 
     group = Groups(user=request.user) 

    # If we had a POST then get the request post values. 
    if request.method == 'POST': 
    # Populate the form with the instance. 
     form = GroupFrom(request.POST, instance=group) 
     # Check we have valid data before saving trying to save. 
     if form.is_valid(): 
      group.save() 
      messages.add_message(request, messages.SUCCESS, 'Successfully Created/Updated Group') 

    else: 
     # Populate from at this point group with either be blank or have values. 
     form = GroupFrom(instance=group) 

    context = {'form': form} 
    return render_to_response('contacts/group.html', context, context_instance=RequestContext(request)) 

回答

1

可以缩短你的代码相当多:

class GroupForm(forms.ModelForm): 
    class Meta: 
     model = Group 

    def __init__(self, *args, **kwargs) 
     user = kwargs.pop('user') 
     super(GroupForm, self).__init__(*args, **kwargs) 
     self.user = user 

def group(request, id=None): 
    if id: 
     instance = get_object_or_404(Groups, pk=id) 
    else: 
     instance = None 

    form = GroupFrom(request.POST or None, instance=instance, user=request.user) 

    if request.method == 'POST': 
     if form.is_valid(): 
      group = form.save() 
    return render_to_response('contacts/group.html', {'form': form}, 
     context_instance=RequestContext(request)) 

的GroupForm的__init__一个简单的替代,您可以从该请求的用户的手,无需手动分配的价值为您节省视图。表单初始化中的or语句允许您在一个地方执行实例化,而不是在GET请求中有单独的方法。您的用户外键属性为unique=True。在视图中手动分配它不会得到任何验证。在表单被实例化时分配属性在提交表单之前应该触发验证错误。

+0

是的,这是独特的=真,我更新了我的问题,以纳入你的想法(一些什么)和完美的作品。谢谢布兰登。 – jason 2013-03-13 17:22:44

1

尝试更换

  group = Groups(
      name=form.cleaned_data['name'], 
      description=form.cleaned_data['description'], 
      active=form.cleaned_data['active'], 
      user=request.user 
     ) 

由:

 group.name=form.cleaned_data['name'] 
     group.description=form.cleaned_data['description'] 
     group.active=form.cleaned_data['active'] 
     group.user=request.user 

group = Groups(只是擦除变量的前值。

+0

我已更新以反映(请参阅问题更新),但我仍然在保存新对象时发生错误。 – jason 2013-03-13 17:19:44