django view integrityError

时间:2013-03-13 16:44:43

标签: django django-views

我需要以下代码的帮助。我想我差不多了。我正在尝试创建一个包含编辑和添加新对象的视图的视图。但是,在保存时,我会收到下面列出的错误。

我想知道是否有人可以告诉我哪里出错了?

谢谢。

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

错误

/ contacts / group / edit / 1 /中的IntegrityError (1062,“密钥'user_id'的重复条目'1'”

更新: 所以这就是我现在所拥有的,它可以工作,但只有编辑才能添加。在添加时,我仍然会收到相同的错误:

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

2 个答案:

答案 0 :(得分:1)

尝试替换

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

by:

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

您的group = Groups(只是删除变量的先前值。

答案 1 :(得分: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。在视图中手动分配它将不会捕获任何验证。在实例化表单时分配属性应该在提交表单之前触发验证错误。