0

我在我的应用程序中创建了一个表单,我可以在其中获取用户的详细信息。现在我可以编辑表格,但我无法保存数据。我想保存更改的数据并继续。

它说:该用户的成人已经存在。

我的 urls.py:

url(r'^home/editform/(?P<userpk>[^/]+)/$', 'lexuseditform', name='lexuseditform'),
url(r'^home/edited/(?P<userpk>[^/]+)/$', 'lexusedited', name='lexusedited')

我的意见.py:

@login_required                              
def lexuseditform(request,userpk):
    if int(userpk) != request.user.pk:
        return HttpResponseForbidden()
    else:
        adult = Adult(user=request.user)
        if request.method == 'POST': # If the form has been submitted...
            form = AdultForm(request.POST,instance=adult) # A form bound to the POST data
            if form.is_valid(): # All validation rules pass
              form.save()
              redirect_url = reverse('lexusedited')
              return HttpResponseRedirect(redirect_url) # Redirect after POST
        else:
           form = AdultForm(instance=adult) # An unbound form

    return render(request,'lexus/lexuseditform.html', {'form': form})

@login_required                              
def lexusedited(request,userpk):
    return render(request,'lexus/lexusedited.html')

我的forms.py:

从模型导入成人从 django.forms 导入 ModelForm

class AdultForm(ModelForm):
    """
    Edit Profile Information
    """
    class Meta:
        model = Adult
        fields = ('user', 'email','fullname')

我的模型.py:

from django.db import models
from django.contrib.auth.models import User

class Adult(models.Model):
    """
    Adult Information
    """
    user = models.OneToOneField(User)
    fullname = models.CharField(max_length=100)
    email = models.EmailField()

    def __unicode__(self):
        return self.user.username

不知道我的错误在哪里。需要一些指导..谢谢..

4

3 回答 3

1

虽然你没有展示Adult模型结构,但我敢打赌它有类似的东西

class Adult(models.Model):
    user = models.ForeignKey(User, unique=True)

这就是为什么您不能使用相同的用户(名称)保存 new Adult() 的原因。因此,您必须更改模型,或者为指定用户加载现有的 Adult:

if Adult.objects.filter(user=request.user).exists():
    adult = Adult.objects.get(user=request.user) # load existing Adult
else:
    adult = Adult(user=request.user) # create new Adult

但我不知道你的表格和模型是什么样子的。

更新:

或使用:

adult, is_created = Adult.objects.get_or_create(user=request.user)
于 2012-07-05T07:59:00.173 回答
1

有点猜测,因为您没有发布表单和模型的代码,但假设表单是常规模型表单,您的问题很可能来自您的成人模型对用户具有唯一约束(OneToOneField 或带有unique=True) 的外键。由于您为表单创建了一个新的 Adult 实例,因此它违反了唯一性约束。假设(再次)这个约束是您想要的,并且您的视图应该为用户创建一个相关的成人实例(如果它尚不存在)或编辑现有的实例,您需要首先检查是否有成人实例对于用户:

@login_required                              
def lexuseditform(request):
    try:
        adult = Adult.objects.get(user=request.user)
    except Adult.DoesNotExist:
       adult = Adult(user=request.user)
    #... your code here

另请注意,如果您考虑一下,我删除了没有用的userpk论点和测试。request.user.pk

于 2012-07-05T08:01:10.857 回答
0

正确版本(参考 Tisho 的回答):

我的意见.py:

@login_required                              
def lexuseditform(request,userpk):
    if Adult.objects.filter(user=request.user).exists():
        adult = Adult.objects.get(user=request.user) # load existing Adult
    else:
        adult = Adult(user=request.user) # create new Adult
    if request.method == 'POST': # If the form has been submitted...
        form = AdultForm(request.POST,instance=adult) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            form.save()
            redirect_url = reverse('lexusedited')
            return HttpResponseRedirect(redirect_url) # Redirect after POST
    else:
           form = AdultForm(instance=adult) # An unbound form

    return render(request,'lexus/lexuseditform.html', {'form': form})
于 2012-07-05T08:47:05.767 回答