djangoユーザーをOneToOneField
に拡張して、アドレスなどを格納できるようにしました。ModelFormsのOneToOneFieldフィールドを取得する
SiteUser
はを使用してUser
を拡張するモデルです。 ModelForm
にUser
とSiteUser
の両方のフィールドを取得するにはどうすればよいですか?
def edit_profile(request):
username = request.user
user = User.objects.get(username__exact=username)
profileform_class = ProfileForm
if request.method == 'POST':
profileform = profileform_class(data=request.POST, instance=user)
if profileform.is_valid():
profileform.save()
return redirect('profile')
else:
profileform = profileform_class(instance=user)
return render(request, 'edit_profile.html', {
'user': user,
'profileform': profileform,
})
そして、二つのモデル::
class Product(models.Model):
order = models.IntegerField(default=0)
name = models.CharField(max_length=255)
description = models.TextField()
image = models.ImageField(upload_to='product-images', default='default.jpg')
price = models.FloatField()
slug = models.SlugField(unique=True)
class SiteUser(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
address = models.CharField(max_length=255)
post_number = models.CharField(max_length=255, default='')
post_location = models.CharField(max_length=255, default='')
HTMLページは、私が上のフォームをしたい問題の
class ProfileForm(ModelForm):
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email')
class AddressForm(ModelForm):
pass
ビュー:ここ
は、これまでのところ、関連するコードです。{% extends 'base.html' %}
{% block title %}
Rediger {{ product.name }} - {{ block.super }}
{% endblock title %}
{% block content %}
<h1>Rediger "{{ user }}"</h1>
<form role="form" action="" method="post">
{% csrf_token %}
{{ profileform.as_p }}
{{ addressform.as_p }}
<button type="submit">Submit</button>
</form>
{% endblock content %}
だから、これは近い私が欲しかったものに私を得た、ありがとう! しかし、今問題は、アドレスフォームがどのユーザーを参照しているのかわからないことです。したがって、フォームには既にアドレスがある場合は自動入力されず、新しいアドレスを保存することはできません。 フォームの「ユーザー」モデル。pyはすでに1人のユーザーしかいないため、どちらが原因であるかを既に知っています。しかし、単に "SiteUser"を参照しても、現在のユーザーを指し示すことはありません。 スクリプトの他の部分では、モデルを表示したい場合は、モデルのさまざまな部分にアクセスするためにuser.siteuserを使用します。 "all()"は明らかに1つのステートメントだけをとります –
@AndreasHalvorsenTollånes対応するSiteUserモデルを参照するために私の答えを編集しました。 all()への呼び出しを修正しました:リスト/タプルを渡すことになっています。これが動作するかどうか教えてください:) –
はい!これで動作しますが、instance = user.siteuserをelseに追加したいフィールドを自動入力するには:addressform = addressform_class(instance = user.siteuser)^^ –