0

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

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

谢谢你。

视图.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))

网址.py

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

模型.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))
4

2 回答 2

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

于 2013-03-13T17:18:32.377 回答
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(只是删除了group变量的先前值。

于 2013-03-13T17:15:33.653 回答