Django ModelForm, обеспечивающая целостность FK без использования его в форме
У меня есть модель профиля пользователя с моделью формы:
class Profile(models.Model):
# Managed fields
user = models.OneToOneField(User, related_name="profile", on_delete=models.CASCADE)
memberId = models.CharField(unique=True, max_length=15, null=False, blank=False, default=GenerateFA)
bio = models.TextField(null=True, blank=True)
avatar = models.ImageField(upload_to="static/MCARS/img/members", null=True, blank=True)
birthday = models.DateField(null=True, blank=True)
gender = models.CharField(max_length=10, choices=constants.GENDER_CHOICES, null=True, blank=True)
invited = models.BooleanField(default=False)
registered = models.BooleanField(default=False)
height = models.PositiveSmallIntegerField(null=True, blank=True)
phone = models.CharField(max_length=32, null=True, blank=True)
address = models.CharField(max_length=255, null=True, blank=True)
number = models.CharField(max_length=32, null=True, blank=True)
city = models.CharField(max_length=50, null=True, blank=True)
state = models.CharField(max_length=50, null=True, blank=True)
zip = models.CharField(max_length=30, null=True, blank=True)
facebook = models.URLField(null=True, blank=True)
Twitter = models.URLField(null=True, blank=True)
LinkedIn = models.URLField(null=True, blank=True)
Instagram = models.URLField(null=True, blank=True)
Snapchat = models.URLField(null=True, blank=True)
website = models.URLField(null=True, blank=True)
class UserProfileForm(ModelForm):
class Meta:
model = Profile
exclude = ('user','memberId','invited', 'registered')
Я не хочу, чтобы user
был в форме, но помнил, кто является пользователем, при сохранении в модель. Как мне это обеспечить? Без этого компилятор выдает ошибку целостности FK.
Вот что у меня есть в представлении:
@login_required()
def Profile(request, memberid=None):
if memberid:
user = User.objects.select_related('profile').get(id=memberid)
else:
user = User.objects.select_related('profile').get(id=request.user.id)
errors = None
if request.method == 'POST':
print('found me')
data = request.POST
form = UserProfileForm(data)
form.user = user
if form.is_valid():
form.save()
else:
print('form is invalid')
errors = form.errors
context = {
'pagetitle': 'MCARS - Service Record',
'user': user,
'rank': Rank.objects.get(user=user.id),
'assignments': Assignment.objects.filter(user=user.id),
'form': UserProfileForm(),
}
if errors:
context['errors'] = errors
return render(request, template_name='MCARS/pages/ServiceRecord.html', context=context)
Спасибо!
Нам не нужно извлекать пользователя, так как у нас уже есть пользователь: request.user
, поэтому мы можем работать с:
@login_required
def Profile(request, memberid=None):
if request.method == 'POST':
form = UserProfileForm(request.POST, request.FILES)
form.user = user
if form.is_valid():
form.instance.user = request.user
form.save()
return redirect('name-of-some-view')
else:
form = UserProfileForm()
context = {
'pagetitle': 'MCARS - Service Record',
'user': request.user,
'rank': Rank.objects.get(user=request.user),
'assignments': Assignment.objects.filter(user=request.user),
'form': form,
}
return render(
request, template_name='MCARS/pages/ServiceRecord.html', context=context
)
Обычно вы не создаете новую форму при сбое запроса POST, но вы повторно отправляете форму, которая, если вы правильно отобразите форму, покажет ошибки вместе с заполненными данными. данные.
Вы также обычно перенаправляете, если форма действительна и корректна для реализации Post/Redirect/Get архитектурный шаблон [wiki].