Я расширил пользователя django с помощью OneToOneField
, чтобы сохранить адрес и т. Д.Получить поля пользователя OneToOneField в ModelForms
SiteUser
- это модель, которая распространяется User
с использованием OneToOneField
. Как я могу получить поля как User
, так и SiteUser
в одном ModelForm
?
Вот соответствующий код до сих пор:
class ProfileForm(ModelForm):
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email')
class AddressForm(ModelForm):
pass
Просмотр в вопросе:
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 страницы Я хочу формы на:
{% 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 уже знает, какой из них является причиной, может быть только один пользователь. Но просто ссылаться на «SiteUser» не будет указывать на текущего пользователя. В других частях сценария я использую user.siteuser для доступа к различным частям модели, если я хочу его отобразить. И «все()», по-видимому, принимает только одно утверждение –
@ AndreasHalvorsenTollånes Отредактировав мой ответ, обратитесь к соответствующей модели SiteUser. Исправлено обращение ко всем(): вы должны передать ему список/кортеж, извините. Скажите, если это работает :) –
Да! Теперь он работает, но для автозаполнения полей вы хотите добавить экземпляр = user.siteuser в else: addressform = addressform_class (instance = user.siteuser) ^^ –