0

私は自分のアプリで、suerの詳細を取得できるフォームを作成しました。これでフォームを編集できますが、データを保存できません。変更したデータを保存して次に進みます。

それは言う:このユーザーの大人はすでに存在します。

私のurls.py:

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

私のviews.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:

モデルからAdultをインポートしますdjango.formsからインポートModelForm

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

私のmodels.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)

そのため、同じuser(name)で新しい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または)を使用したForeignKey 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の回答を参照):

私のviews.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 に答える