Форма 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 исключения модели.

Вернуться на верх