Django модель TypeError в / writeReview / 1 __str__ вернула не строку (тип int) - PullRequest
1 голос
/ 02 апреля 2020

У меня возникли проблемы, связанные с вышеуказанной ошибкой (также показано на рисунке 4). Может ли кто-нибудь помочь мне здесь? Я вижу эту ошибку при попытке отправить форму, которая сохраняет данные в ReviewTable, как показано на рисунке 2. Я также добавил следующий код:


    TypeError at /writeReview/1

    __str__ returned non-string (type int)

    Request Method:     GET
    Request URL:    http://55fde5117b01476bb57eb987ae0e9a37.vfs.cloud9.us-east-2.amazonaws.com/writeReview/1?csrfmiddlewaretoken=yJ0M6sDxPjEZJmJxrR0JMLFYJzboppJ6NGfa5H25D7ieDNTVQKIy9pFhu9WKYsDA&reviewText=This+is+a+test+&rating=2
    Django Version:     3.0.2
    Exception Type:     TypeError
    Exception Value:    

    __str__ returned non-string (type int)

    Exception Location:     /home/ec2-user/.local/lib/python3.6/site-packages/django/db/models/base.py in __repr__, line 518
    Python Executable:  /usr/bin/python36
    Python Version:     3.6.10
    Python Path:    

    ['/home/ec2-user/environment/HangryBirds',
     '/usr/lib64/python3.6',
     '/usr/lib64/python3.6/lib-dynload',
     '/home/ec2-user/.local/lib/python3.6/site-packages',
     '/usr/local/lib64/python3.6/site-packages',
     '/usr/local/lib/python3.6/site-packages',
     '/usr/lib64/python3.6/dist-packages',
     '/usr/lib/python3.6/dist-packages']

    Server time:    Thu, 2 Apr 2020 16:44:16 +0000
    Traceback Switch to copy-and-paste view

        /home/ec2-user/.local/lib/python3.6/site-packages/django/db/models/fields/__init__.py in get_prep_value

                        return int(value)

             …
        ▶ Local vars
        During handling of the above exception (int() argument must be a string, a bytes-like object or a number, not 'RestaurantTable'), another exception occurred:
        /home/ec2-user/.local/lib/python3.6/site-packages/django/core/handlers/exception.py in inner

                        response = get_response(request)

             …
        ▶ Local vars
        /home/ec2-user/.local/lib/python3.6/site-packages/django/core/handlers/base.py in _get_response

                            response = self.process_exception_by_middleware(e, request)

             …
        ▶ Local vars
        /home/ec2-user/.local/lib/python3.6/site-packages/django/core/handlers/base.py in _get_response

                            response = wrapped_callback(request, *callback_args, **callback_kwargs)

             …
        ▶ Local vars
        /home/ec2-user/environment/HangryBirds/home/views.py in writeReview

                    newReview.save()

         ```


Views.py[1]
Here's the views.py file where the form data is saved to the ReviewTable in models.py
def writeReview(request, parameter):
    if request.method == 'GET':
        newReview = ReviewTable()
        username = request.session['username']
        newReview.review = request.GET['reviewText']
        newReview.rating = request.GET['rating']
        newReview.timestamp = datetime.datetime.now()
        newReview.userObj_id = UserTable.objects.filter(username=username)
        newReview.menuObj_id = parameter
        newReview.restObj_id = MenuTable.objects.filter(item_ID=parameter).first().restObj
        newReview.save()
        template = loader.get_template("showReview.html")
        return HttpResponse(template.render())

    else:
        template = loader.get_template("home.html")
        return HttpResponse(template.render())```

Models.py 2 Вот схема таблицы обзора: -


    class ReviewTable(models.Model):
        userObj = models.ForeignKey(UserTable, on_delete=models.CASCADE)
        menuObj = models.ForeignKey(MenuTable, on_delete=models.CASCADE)
        restObj = models.ForeignKey(RestaurantTable, on_delete=models.CASCADE)
        review = models.CharField(max_length=1000)
        timestamp = models.DateTimeField(auto_now=True, editable=True)
        rating = models.IntegerField()

        def __str__(self):
            return self.id```

    ShowReview.html[3]
Here's the html form section where the data is transfered to views.py for saving to the table.
    ```<div class="right-template">
                {% for m in menu_ID %}
                    <h2>{{ m.item_name }}</h2>
                    <h2>Reviews</h2>
                    {% for r in review_ID %}
                        {% if r.menuObj_id == m.item_ID %}
                            <h4>{{ r.userObj.username }}</h4>
                            <p>{{ r.review }}</p>
                            <p>{{ r.timestamp }}</p>
                            <p>{{ r.rating }}</p>
                        {% endif %}
                    {% endfor %}
                     <h2>Write a Review</h2>
                     {% block content %}
                        <form method="GET" action="{% url 'writeReview' parameter=m.item_ID %}" >
                            {% csrf_token %}
                            <div>
                                <textarea id="reviewText" name="reviewText" rows="5" cols="50" max_length="900"></textarea>
                                <label for="rating">Rating</label>
                                <input type="number" name="rating" max_length="5" id=rating>
                                <button type="submit" class="btnRest">Submit</a>
                            </div>    
                        </form>
                    {% endblock %}
                  {% endfor %}

Ошибка pi c 4

1 Ответ

0 голосов
/ 02 апреля 2020

Как говорит исключение, __str__ должен возвращать строку . self.id, это int, а не строка. Вы можете использовать str(..) для преобразования int в строку:

class ReviewTable(models.Model):
    # &hellip;

    def __str__(self):
        return <b>str(</b>self.id<b>)</b>

Обратите внимание, что, по вашему мнению, вы должны либо использовать .newReview.restObj = restaurant_object, либо .newReview.restObj_id = id_of_restaurant_object:

def writeReview(request, parameter):
    if request.method == 'GET':
        newReview = ReviewTable()
        username = request.session['username']
        newReview.review = request.GET['reviewText']
        newReview.rating = request.GET['rating']
        newReview.timestamp = datetime.datetime.now()
        newReview<b>.userObj</b> = UserTable.objects<b>.get(</b>username=username<b>)</b>
        newReview.menuObj_id = parameter
        newReview<b>.restObj</b> = MenuTable.objects.first(item_ID=parameter).restObj
        newReview.save()
        template = loader.get_template("showReview.html")
        return HttpResponse(template.render())

    else:
        template = loader.get_template("home.html")
        return HttpResponse(template.render())

Примечание : GET-запрос не должен иметь побочных эффектов , следовательно, создание объектов, когда пользователь делает GET-запрос, не соответствует со стандартом HTTP. Поэтому может быть лучше превратить это в запрос POST.

...