私はUser
を拡張するクラスを持っているので、物理アドレスも格納できます。ModelFormでユーザーを拡張するクラスに書き込む方法
from django.contrib.auth.models import User
class CustomUser(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
street = models.CharField(max_length=80, default="")
post_name = models.CharField(max_length=80, default=None)
post_number = models.IntegerField(default=None)
のSQLiteデータベース内のモデルは、列を保持:views.py
Iで
class BasicUserSettingsForm(forms.ModelForm):
class Meta:
model = User
fields = ['first_name', 'last_name', 'email']
class CustomUserSettingsForm(forms.ModelForm):
class Meta:
model = CustomUser
fields = ['street', 'post_name', 'post_number']
:
frontend_customuser:
id
street
user_id # not sure how this is created, concat of CustomUser and User fields?
post_name
post_number
私はそうのようなUser
からのデータを変更するユーザとCustomUser
を可能にする形態を有します下記のようにDBに表示/書き込みしようとしています。 User
テーブルを表示して変更することはできますが、CustomUser
で管理されている(まだ空のままです)テーブルには触れません(エラーはNOT NULL constraint failed: frontend_customuser.user_id
です)。私が間違っているかもしれないことについてのヒント?このデータをすべてCustomUser
(これはUser
)に書き込むより簡単な方法はありますか?
def settings(request):
# Prepare data to be filled into forms. User should always exist so no try/except call.
prefill_user = User.objects.get(pk=request.user.id)
# In case CustomUser table is empty, instantiate a CustomUser with request.user.id user_id.
try:
prefill_customuser = CustomUser.objects.get(pk=request.user.id)
except ObjectDoesNotExist:
prefill_customuser = CustomUser(user_id=request.user.id)
if request.method == "GET":
# If CustomUser table is empty, fields will appear empty. If prefill_customuser is successful
# at retrieving data, I expect this to be populated by values from the database.
settings_form_user = BasicUserSettingsForm(initial={'first_name': prefill_user.first_name,
'last_name': prefill_user.last_name,
'email': prefill_user.email},
instance=prefill_user)
settings_form_customuser = CustomUserSettingsForm(initial={'street': prefill_customuser.street,
'post_name': prefill_customuser.post_name,
'post_number': prefill_customuser.post_number},
instance=prefill_customuser)
if request.method == "POST":
settings_form_user = BasicUserSettingsForm(request.POST, instance=prefill_user)
try:
customuser_instance = CustomUser.objects.get(pk=request.user.id)
settings_form_customuser = CustomUserSettingsForm(request.POST, instance=customuser_instance)
except ObjectDoesNotExist:
settings_form_customuser = CustomUserSettingsForm(request.POST)
if settings_form_user.is_valid() and settings_form_customuser.is_valid():
settings_form_user.save()
settings_form_customuser.save()
else:
settings_form_user = BasicUserSettingsForm(request.POST)
settings_form_customuser = CustomUserSettingsForm(request.POST)
return render(request, 'frontend/nastavitve.html',
{'settings_form_user': settings_form_user, 'settings_form_customuser': settings_form_customuser})
Googleで認証しようとするとエラーが発生しました。「パスワード」フィールドはありません。私は何かを上書きしましたか、これは期待されていますか?残念ながら、私はドキュメントの中でこれを見ていません。 「ユーザー」を新たに導入することは安全ですか? –