Django / фильтровать поля формы и получать ошибку 'int' объект не имеет атрибута '_meta'

hello Я новичок в django и у меня есть проблема, если кто-то может направить меня, я буду благодарен

Я использую django-cities-light для туристического сайта и хотел бы отфильтровать города в полях ville_de_depart и ville_destination в newBookingForm по trip.depart и trip.destination.

Я пытался передать объект поездки в экземпляр newBookingForm я переопределил init и я взял значение depart и destination, мне удалось отфильтровать поля, но я больше не смог сохранить newBooking, представление перенаправляет на страницу alltrip без ошибки, но нет нового бронирования в базе данных

Я попытался заменить trip на slug, который является тем же значением, что и id, и он показывает мне эту ошибку

'int' object has no attribute '_meta'

Я много искал и это действительно утомило меня Я не могу найти решение для фильтрации полей tow без каких-либо проблем если кто-нибудь сможет мне помочь, я буду благодарен

models.py



class trip(models.Model):

    depart = models.ForeignKey(default='',to=Country,on_delete=models.CASCADE,related_name='depart') 
    destination = models.ForeignKey(default='',to=Country,on_delete=models.CASCADE)
    date_de_depart = models.DateField(default='')
    prix_kg = models.PositiveIntegerField(default='')
    collecte = models.BooleanField(default=False,null=False,help_text='' )
    creation_date = models.DateTimeField(auto_now=True)
    author = models.ForeignKey(to=settings.AUTH_USER_MODEL,on_delete=models.CASCADE,default='')
 
    slug = models.SlugField(max_length=100, default='' )

    #jouter slug
    def save(self, *args , **kwargs):
        super(trip, self).save(*args , **kwargs)
        if not self.slug:
            self.slug = self.id
            self.save()
    

    def __str__(self):
        return f'{self.id} {self.author} '




class Booking(models.Model):

    trip = models.ForeignKey(trip,on_delete=models.CASCADE, default='',)
    author =  models.ForeignKey(to=settings.AUTH_USER_MODEL,on_delete=models.CASCADE,default='')
    creation_date = models.DateTimeField(auto_now=True)
    ville_de_depart = models.ForeignKey(City,on_delete=models.CASCADE,default='')
    slug = models.SlugField(max_length=100, default='' )
    # ville_depart = models.ForeignKey(default='',to=City,on_delete=models.CASCADE,related_name='ville_dep')
    sender_phone = PhoneNumberField(blank=True)
    receiver_phone = PhoneNumberField()    
    ville_destination = models.ForeignKey(default='',to=City,on_delete=models.CASCADE,related_name='ville_dest')


   

    #jouter slug
    def save(self, *args , **kwargs):
        super(Booking, self).save(*args , **kwargs)
        if not self.slug:
            self.slug = self.id
            self.save()
    

    def __str__(self):
        
        return str(self.trip.author)

views.py


def detailsTrip(request, slug):
    
    trip = get_object_or_404(models.trip,slug=slug)
    
    auth = trip.author
   

    bookingForm = newBookingForm(instance=slug)
    context = {'trip': trip, 'auth': auth, 'form': bookingForm}
  


    if request.method == 'POST':
        form = newBookingForm(request.POST , instance=slug )


        if request.user.is_authenticated:

            if form.is_valid():
                trip = get_object_or_404(models.trip,slug=slug)
               

                Booking = form.save(commit=False)
                Booking.trip_id= trip.id
                Booking.author_id = request.user.id
                Booking = form.save()
                
                return redirect('/alltrips')
            else:
                trip = get_object_or_404(models.trip,slug=slug)
                auth = trip.author
                bookingForm = newBookingForm()

                context = {'trip': trip, 'auth': auth, 'form': bookingForm}
                return render(request, 'detailstrip.html', context)

                

        else:
            return render (request, 'notFound.html')
        


    
    
    return render(request,'detailstrip.html', context , )

forms.py



class newBookingForm(forms.ModelForm,):

    def __init__(self,*args,**kwargs):
        
        # capture the instance : Slug
        slug = kwargs.get('instance')

        # capture current trip
        Trip = get_object_or_404(trip, id=slug)
    
        # Filter cities field by the instance : trip.depart  / trip.destination
        super(newBookingForm, self).__init__(*args,**kwargs)
        self.fields['ville_de_depart'].queryset = City.objects.filter(country_id=Trip.depart)
        self.fields['ville_destination'].queryset = City.objects.filter(country_id=Trip.destination)
       
    
    class Meta:
        
        
            model = Booking
            fields = ['ville_de_depart','ville_destination']
            exclude = ['sender_phone','receiver_phone']

Пока вы используете поля типа "многие ко многим", вам нужно вызывать form.save_m2m() после сохранения экземпляра модели.

прочитайте эту документацию о методе сохранения

решение

#view.py

def detailsTrip(request, slug):

trip = get_object_or_404(models.trip,slug=slug)
auth = trip.author
#add the trip to the form
bookingForm = newBookingForm(trip=trip)

context = {'trip': trip, 'auth': auth, 'form': bookingForm}


if request.method == 'POST':

    #add the object trip to the form here too

    form = newBookingForm(trip,request.POST )

    if request.user.is_authenticated:

        if form.is_valid():
            trip = get_object_or_404(models.trip,slug=slug)
           
            Booking = form.save(commit=False)
            Booking.trip_id= trip.id
            Booking.author_id = request.user.id
            Booking = form.save()
            
            return redirect('/alltrips')
        else:
            trip = get_object_or_404(models.trip,slug=slug)
            auth = trip.author
            bookingForm = newBookingForm()

            context = {'trip': trip, 'auth': auth, 'form': bookingForm}

            return render(request, 'detailstrip.html', context)
    else:
        return render (request, 'notFound.html')

return render(request,'detailstrip.html', context , )

form.py

class newBookingForm(forms.ModelForm,):
class Meta:
    
        model = Booking
        fields = ['ville_de_depart','ville_destination']
        exclude = ['sender_phone','receiver_phone']

       
def __init__(self,trip,*args,**kwargs):

        
        # Filter cities field by trip.depart  / trip.destination
        super(newBookingForm, self).__init__(*args,**kwargs)
        self.fields['ville_de_depart'].queryset = City.objects.filter(country=trip.depart)
        self.fields['ville_destination'].queryset = City.objects.filter(country=trip.destination)         
            
                



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