Форма Django с отношениями m2m не сохраняется
У меня есть форма, в которой я хочу, чтобы request.user
заполнялась как можно меньше и полагалась на то, что представления будут заполнять другие поля автоматически.
В результате некоторые из этих полей не отображаются на форме.
Код в моем представлении, кажется, работает нормально для FK relationship
, но почему-то m2m
не работает.
Вероятно, я впервые пытаюсь сохранить форму с помощью m2m и, возможно, я что-то упускаю.
На данный момент ошибка, которую я получаю с текущим кодом, выглядит так 'VoucherForm' object has no attribute 'user'
. Это происходит потому, что поле пользователя не присутствует в form.py, поскольку я хочу обрабатывать его непосредственно в представлении
Если я удалю voucherform.user.add(userprofile)
из представления, форма сохранится, но не добавит пользователя.
модель
class UserProfile(models.Model):
user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
class Voucher(models.Model):
user = models.ManyToManyField(User, blank=True)
venue = models.ForeignKey(Venue, blank=True, null=True, related_name="vouchervenues", on_delete=models.CASCADE)
title = models.TextField('voucher title', blank=True)
terms = models.TextField('terms & conditions', blank=True)
form
class VoucherForm(ModelForm):
class Meta:
model = Voucher
fields = ('title','terms')
labels ={
'title': '',
'terms': '',
}
widgets = {
'title': forms.TextInput(attrs={'class':'form-control', 'placeholder':'Enter title'}),
'terms': forms.TextInput(attrs={'class':'form-control', 'placeholder':'Enter terms'}),
}
просмотров
def add_voucher(request, userprofile_id):
url = request.META.get('HTTP_REFERER')
venue = UserProfile.objects.filter(user=request.user).values('venue')
userprofile = UserProfile.objects.get(id=userprofile_id)
submitted = False
if request.method =="POST":
voucherform = VoucherForm(request.POST)
if voucherform.is_valid():
data = voucherform.save(commit=False)
data.user_id = userprofile.id
data.venue_id = venue
data.save()
voucherform.save_m2m()
voucherform.user.add(userprofile)
return HttpResponseRedirect(url)
else:
voucherform = VoucherForm
if 'submitted' in request.GET:
submitted=True
return redirect('venue-loyalty-card',{'submitted':submitted,'userprofile':userprofile})
В основном, проблема в том, что вы не указали поле user
в VoucherForm
в fields
, поэтому он говорит "VoucherForm" объект не имеет атрибута 'user', вы можете сделать следующее:
from django.shortcuts import get_object_or_404
def add_voucher(request, userprofile_id):
url = request.META.get('HTTP_REFERER')
venue = UserProfile.objects.filter(user=request.user).values('venue')
userprofile = UserProfile.objects.get(id=userprofile_id)
submitted = False
if request.method =="POST":
voucherform = VoucherForm(request.POST)
if voucherform.is_valid():
data = voucherform.save(commit=False)
data.user_id = userprofile.id
data.venue_id = venue
data.save()
voucherform.save_m2m()
current_voucher_instance= get_object_or_404(Voucher,id=data.id)
current_voucher_instance.user.add(userprofile.id)
return HttpResponseRedirect(url)
else:
voucherform = VoucherForm
if 'submitted' in request.GET:
submitted=True
return redirect('venue-loyalty-card',{'submitted':submitted,'userprofile':userprofile})
Примечание: Лучше использовать
get_object_or_404()
, чемget()
, так как он вызываетget()
на данном менеджере модели, но поднимаетHttp404
вместоDoesNotExist
исключения модели.