Почему внутренняя ошибка сервера?TypeError: аргумент float () должен быть строкой или числом, а не BoundField - PullRequest
0 голосов
/ 06 июня 2018

Я создал приложение для проката фильмов в Django 2.0 и Python 3.6.Я получаю сообщение об ошибке в BoundField и пытаюсь добавить новый фильм в существующую таблицу в базе данных, например, movie_name и price.Ниже указан код:

#module.py file
from django.db import models
from django.forms import ModelForm


class Customer(models.Model):
    f_name = models.CharField(max_length=50)
    l_name = models.CharField(max_length=50)
    address = models.CharField(max_length=125)
    cell = models.IntegerField(blank=True, null=True)


class Movie(models.Model):
    genre = models.CharField(max_length=50)
    price = models.FloatField(blank=True, null=True)
    flag = models.BooleanField(default=True)
    user_id = models.ForeignKey('Customer', on_delete=models.SET_NULL, null=True) 

views.py code

from django.shortcuts import render
from .models import Customer, Movie
# from django.http import HttpResponseRedirect
from .forms import MovieForm, CustForm


def dashboard(request):
    customer_data = Customer.objects.all()
    context = {'Customer_List': customer_data}
    return render(request, 'movie_renting_app/home.html', context)


def movie_list(request):
    movie_data = Movie.objects.all()
    context = {"Movie_List": movie_data}
    return render(request, 'movie_renting_app/all_movies.html', context)


def rented_movies(request):
    rented_movie = Movie.objects.filter(flag=True)
    context = {"Rented_Movies_List": rented_movie}
    return render(request, 'movie_renting_app/rent.html', context)


def add_movies(request):
    if request.POST:
        form = MovieForm()
        print(request)
        m = Movie(genre=form['genre'], price=form['price'], flag=form['flag'])
        m.save()
        return movie_list(request)
    else:
        form = MovieForm()
        return render(request, 'movie_renting_app/new_movie.html', {'form': form})


def add_customer(request):
    if request.POST:
        form = request.POST
        print(request)
        c = Customer(f_name=form['f_name'], l_name=form['l_name'], address=form['address'], cell=form['cell'])
        c.save()
        return dashboard(request)
    else:
        form = CustForm()
        return render(request, 'movie_renting_app/new_customer.html', {'form': form})


def update_customer_info(request):
    pass


def available_list(request):
    pass

forms.py code

from django import forms
from .models import Movie


class MovieForm(forms.ModelForm):
    class Meta:
        model = Movie
        fields = ['genre', 'price', 'flag']


class CustForm(forms.Form):
    f_name = forms.CharField(label='First_Name', max_length=50)
    l_name = forms.CharField(label='Last_Name', max_length=50)
    address = forms.CharField(label='Address', max_length=125)
    cell = forms.IntegerField(label='Cell')

Я прилагаю командную строку Internal Server Error ошибка.Я пробовал различные способы изменить значение цены, и даже я не уверен, что не так с моим кодом.Это говорит о внутренней ошибке сервера.

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Прежде всего, вам нужно знать, когда вы создаете форму, это, вероятно, означает, что вы передадите ей данные.

form = MovieForm() # initialize the form

Вы должны знать, что эта форма была создана с помощью модели,так что MovieForm был сам класс модели, для создания экземпляра вам просто нужно добавить данные, которые приходят из шаблона через request.POST

form = MovieForm(request.POST) # or MovieForm(data=request.POST)

Мы находимся в процессе созданиянапример, но до этого мы не можем допустить какие-либо значения от пользователя, поэтому появляется form.is_valid():

if request.POST:
    form = MovieForm(request.POST) # or MovieForm(data=request.POST)
    if form.is_valid():
        ''' '''

Как только форма верна, мы можем получить все значения из request.POSTкак request.POST['price'].Это будет работать, но это не рекомендуется, извлекать данные из form.cleaned_data лучше и безопаснее, потому что Django преобразует любой объект в тип объекта, предоставленный в форме.Например: если у вас была форма, содержащая BooleanField(), в шаблоне будет сгенерировано Checkbox.Теперь после отправки request.POST.get('bool_field_name') вернет "True" или "False" как string.тогда как Django настроит все для вас, и вы получите логическое значение, как и хотели.Итак, у нас есть:

if request.POST:
    form = MovieForm(request.POST) # or MovieForm(data=request.POST)
    if form.is_valid():
        genre = form.cleaned_data.get('genre')
        ''' rest of the code '''

Поскольку ваша форма построена с ModelForm, вам не нужно извлекать данные из cleaned_data, Django упрощает процесс.Вам просто нужно сохранить форму, и Django автоматически создаст экземпляр.

if request.POST:
    form = MovieForm(request.POST) # or MovieForm(data=request.POST)
    if form.is_valid():
        instance = form.save() 
        # instance = form.save(commit=False) | will not save the instance
        # commit = False | in case you want to do something else before saving
        # By using commit = False, if you have m2mfield
        # You need to call save_m2m() - required if you use commit False.

Примечание * Переменная instance является экземпляром модели, переданной в классе Meta из вашей формы.

class MovieForm(forms.ModelForm):
    class Meta:
        model = Movie
        fields = ['genre', 'price', 'flag']

Для дальнейших объяснений, пожалуйста, обратитесь к Официальной документации

0 голосов
/ 06 июня 2018

Ваш код должен быть таким,

def add_movies(request):
    if request.POST:
        form = MovieForm(request.POST)
        if form.is_valid():
            m = Movie(genre=form.cleaned_data['genre'], price=form.cleaned_data['price'], flag=form.cleaned_data['flag'])
            m.save()
            return movie_list(request)
        return HttpResponse("form is not valid")
    # your code
0 голосов
/ 06 июня 2018

В views.py файле вы присваиваете form для MovieForm(), вам нужно использовать его, как показано ниже:

form = MovieForm(request.POST)

Как упоминалось @Lemayzeur, вам нужно посмотреть документацию Django ( docs ), чтобы узнать, как проверять и обрабатывать данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...