Как сохранить данные внешнего ключа с помощью forms.py?

urls.py

...
path('restaurant/menu/', r_view.Menu, name='menu'),
...

menu.html

<form method="POST" id="menuForm" autocomplete="off" action="" enctype="multipart/form-data">
        {% csrf_token %}
        <div class="form-inline">
            <div class="form-group mb-4">
                {{ form.item|as_crispy_field }}
            </div>
            <div class="form-group mb-4">
                {{ form.itemImage|as_crispy_field }}
            </div>
            <div class="form-group mb-4">
                {{ form.price|as_crispy_field }}
            </div>
            <div class="form-group mb-4">
                {{ form.category|as_crispy_field }}
            </div>
        </div>

        <button type="submit" class="col-md-12 myBtn">Submit</button>
    </form>

views.py

def Menu(request, restaurantID):
    restaurant = get_object_or_404(Restaurant_Account, restaurantID=restaurantID) 
    form = MenuForm()

    if request.method == 'POST':
        form = MenuForm(request.POST, request.FILES)
        if form.is_valid():
            instance = form.save(commit=False)
            instance.restaurant = restaurant
            instance.save()
            messages.success(request, "Saved successfully!")
            return redirect('r_index')
            
    context = {'form':form}
    return render(request, 'restaurant/menu.html', context)

forms.py

class MenuForm(forms.ModelForm):
    restaurantID = Restaurant_Account.objects.filter(restaurantID='restaurantID')
    item = forms.CharField(required=True)
    itemImage = forms.ImageField(required=False, label='Item image')
    price = forms.DecimalField(required=True)
    category = forms.ChoiceField(choices=CATEGORY)
    class Meta:
        model = Menu
        fields = ('item', 'itemImage', 'price', 'category')

models.py

class Menu(models.Model):
    menuID = models.AutoField(primary_key=True)
    restaurantID = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
    item = models.CharField(max_length=100)
    itemImage = models.ImageField(upload_to='images/', blank=True)
    price = models.DecimalField(max_digits=6, decimal_places=2)
    category = models.CharField(
        max_length=20,
        choices=[('', 'Choose category'),('Appetizer', 'Appetizer'),('Entree', 'Entree'),('Drink', 'Drink'),('Dessert', 'Dessert')])
    
    def __str__(self):
        return self.item 

Я новичок в Django.

Я сделал форму для сохранения данных меню. Если пользователь заполняет форму и нажимает кнопку submit, то все данные должны быть сохранены в таблице Menu. Я понятия не имею, как сохранить restaurantID, который является внешним ключом, ссылающимся на таблицу Restaurant, автоматически. (Под автоматически я имею в виду без ввода данных пользователем) Может ли кто-нибудь помочь мне с этим?

Заранее спасибо!

Вам не нужно делать все эти вещи, если вы сделали restaurantID внешним ключом при определении модели, которая является Menu, django сам справится с этим.

Нижеприведенный код может вам подойти:

forms.py

class MenuForm(forms.ModelForm):
    item = forms.CharField(required=True)
    itemImage = forms.ImageField(required=False, label='Item image')
    price = forms.DecimalField(required=True)
    category = forms.ChoiceField(choices=CATEGORY)
    class Meta:
        model = Menu
        fields = ('item', 'itemImage', 'price', 'category')

views.py

def menu(request):
    if request.method == 'POST':
        form = MenuForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            messages.success(request, "Saved successfully!")
            return redirect('r_index')
    else:
        form=MenuForm()
    return render(request, 'restaurant/menu.html', {'form':form})

optional: Вам также не нужно писать эту строку menuID = models.AutoField(primary_key=True) в Menu модели, так как django делает id колонку по умолчанию для AutoField.

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