0

I am writing a restaurant app in Django and I have a specific view that catches an Ajax request. From this request I get the name of a dish, which I try to save in a new object Order. I keep getting this error " ValueError: Cannot assign "'pasta'": "Order.dish_name" must be a "Dish" instance." and I have no idea why. I have been trying to fix it for 2 days, so i would like to know what I am doing wrong

type here

models.py`

from django.db import models

class Table( models.Model ) :
    number = models.IntegerField( primary_key= True)

    def __str__( self ) :
        return str(self.number)
    
class Dish(models.Model ) :
    name = models.CharField( primary_key= True, max_length= 50 )
    price = models.FloatField()
    type = models.CharField( max_length= 50 )
    gluten = models.BooleanField( null= False)
    lactose = models.BooleanField( null= False)


    def __str__( self ) :
        return self.name

class Meal(models.Model ) :
    start = models.TimeField()
    end = models.TimeField(blank= True, null= True, default= None)
    table = models.ForeignKey(Table, on_delete=models.CASCADE)

    def __str__( self ) :
        return str(self.table.number)
    
class Order(models.Model):
    request_time = models.TimeField()
    kitchen_start_time = models.TimeField(blank= True, null= True, default= None)
    delivery_time = models.TimeField(blank= True, null= True, default= None)
    dish_name = models.ForeignKey(Dish, null= True, blank= True, default= None, on_delete=models.CASCADE)
    table = models.ForeignKey(Table, null= True, default= None, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.table.number)````

The main.js

$(".special").click(function (e){
    var x= e.target.id
    $.ajax({
        type: 'POST',
        data: {
            'dishes' : x,
        },
        success: function(response){
            console.log(response);
            },
        error: function(error){
            console.log(error);
            },
    });   
    e.preventDefault();    
}
)

part of the html

 {% for d in dishes %}
      
        <div class="cell">
          <a href=# class="special" id='{{d.name}}' > {{d.name}}</a></li>
        </div>

  {% endfor %}

the view


def open(request, number):

    tav = Table.objects.get(number = number)
    p = Meal(table=tav, start=datetime.now())
    p.save()
    dishes = Dish.objects.all().order_by('type')
    if request.method == 'POST':
        clicked_dish =request.POST.get('dishes')
        new_order= Order(request_time=datetime.now(), dish_name= clicked_dish, table=tav)
        new_order.save()

    return render(request, 'nuovo.html', {'dishes': dishes, 'table': tav})

and the url

urlpatterns = [
    
    re_path(r'^admin/', admin.site.urls),
    re_path(r'home/', views.home),
    re_path(r'^new/',views.index, name='index'),
    re_path(r'^open/(\d+)/$',views.open, name='open'),
]
bhe
  • 15
  • 3

1 Answers1

1

I would filter an instance of dish

from django.http import HttpResponseBadRequest

def open(request, number):
    if request.method == "GET":
        return HttpResponseBadRequest()

    tav = Table.objects.get(number = number)
    p = Meal(table=tav, start=datetime.now())
    p.save()
    d =request.POST.get('dishes', None)
    dish = Dish.objects.filter(id=d).first()
     
    new_order= Order(request_time=datetime.now(), dish_name= dish, table=tav)
    new_order.save()

return render(request, 'nuovo.html', {'dish': dish, 'table': tav})

Hope it work's!

obarbachan
  • 61
  • 5