• 1400/02/13

استاد ارور سرسختی داریم :

سلام

استاد یه بارم پرسیدم این سوالو ولی چون جواب زیادی بهش داده شد و هنوز مشکل حل نشده فک کردم اونو نبینید و دوباره سوال و بپرسم

views
def product_detail(request, *args, **kwargs):
    selected_game_id = kwargs['gameId']
    product_name = kwargs['name']

    games = game.objects.get_by_id(selected_game_id)

    if games is None or not games.active:
        raise Http404('محصول مورد نظر یافت نشد')

    related_game = game.objects.get_queryset().filter(categories__game=game).distinct()

    galleries = GameGallery.objects.filter(game_id=selected_game_id)
    link = DownloadGame.objects.filter(game_id=selected_game_id)

    grouped_related_game = my_grouper(3, related_game)

    context = {
        'games': games,
        'galleries': galleries,
        'link': link,
        'grouped_related_game': grouped_related_game,
    }

    return render(request, 'products/product_detail_game.html', context)
models
class GameManager(models.Manager):
    def get_active_products(self):
        return self.get_queryset().filter(active=True)

    def get_products_by_category(self, category_name):
        return self.get_queryset().filter(categories__name__iexact=category_name, active=True)

    def get_by_id(self, game_id):
        qs = self.get_queryset().filter(id=game_id)
        if qs.count() == 1:
            return qs.first()
        else:
            return None


class game(models.Model):
    title = models.CharField(max_length=150, verbose_name='عنوان')
    developer_game = models.CharField(max_length=150, null=True, verbose_name='سازنده', blank=True)
    size_game = models.CharField(max_length=150, null=True, verbose_name='حجم', blank=True)
    of_on = models.CharField(max_length=150, null=True, verbose_name='آفلاین/آنلاین', blank=True)
    category = models.CharField(max_length=150, null=True, verbose_name='دسته بندی', blank=True)
    text_h1 = models.CharField(max_length=150, null=True, verbose_name='متن بزرگ 1', blank=True)
    text_h2 = models.CharField(max_length=150, null=True, verbose_name='متن بزرگ 2', blank=True)
    description_1 = models.TextField(verbose_name='توضیحات 1', null=True, blank=True)
    description_2 = models.TextField(verbose_name='توضیحات 2', null=True, blank=True)
    image = models.ImageField(upload_to=upload_image_path, null=True, blank=True, verbose_name='تصویر')
    image_1 = models.ImageField(upload_to=upload_image_path, null=True, blank=True, verbose_name='تصویر 1')
    active = models.BooleanField(default=False, verbose_name='فعال / غیرفعال')
    categories = models.ManyToManyField(GameCategory, blank=True, verbose_name="دسته بندی ها")

    objects = GameManager()
urls
urlpatterns = [

    path('game/', ProductsListGame.as_view()),
    path('game/search', SearchProductsView.as_view()),
    path('game/<gameId>/<name>', product_detail),
    path('game/<category_name>', GameListByCategory.as_view()),
    path('products_categories_partial_game', products_categories_partial_game, name='products_categories_partial_game')

]
templte
{% for group in grouped_related_game %}
                        {% for game in games %}
                            <div class="slide">
                                <div class="panel panel-default" style="margin:0;padding-left: 40px">
                                    <img src="{% static 'images/5.jpg' %}" class="img-responsive imgfluid"/>
                                    <div class="panel-body" style="margin: 0">
                                        <h4 style="margin:0;padding-top: 10px">clash of clans</h4>

                                        <button class="btn btn-info1 btn-cs button-cs">
                                            <svg style="margin-left: 10px;padding-right: 0"
                                                 xmlns="http://www.w3.org/2000/svg"
                                                 width="16" height="16" fill="currentColor"
                                                 class="bi bi-download" viewBox="0 0 16 16">
                                                <path d="M.5 9.9a.5.5 0 0 1 .5.5v2.5a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-2.5a.5.5 0 0 1 1 0v2.5a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2v-2.5a.5.5 0 0 1 .5-.5z"/>
                                                <path d="M7.646 11.854a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V1.5a.5.5 0 0 0-1 0v8.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3z"/>
                                            </svg>
                                            دانلود
                                        </button>
                                        +3
                                        <span class="fa fa-star checked"></span>
                                        <span class="fa fa-star checked"></span>
                                        <span class="fa fa-star checked"></span>
                                        <span class="fa fa-star"></span>
                                        <span class="fa fa-star"></span>

                                    </div>
                                </div>
                            </div>
                        {% endfor %}
                    {% endfor %}

البته هنوز تمپلیتو کامل نکردم ولی فک نمیکنم ازین باشه 

  • 1400/02/13
  • ساعت 23:17

سلام وقت بخیر

قبل از هر چیزی لطفا این مورد رو رعایت کنید حتما توی کدنویستون تا کدهاتون خوانایی خیلی بیشتری داشته باشه :

games = game.objects.get_by_id(selected_game_id)

خروجی این عبارت یک object هستش پس باید اسمش game باشه نه games 

گذاشتن اسم جمع برای یک object باعث گمراهی در کد میشه

این خط رو توی template به این صورت اصلاح کنید :

{% for game in group %}

و در آخر این خط related_game همون مشکلی رو دارید دارید که اول متن گفتم اسم جمع رو مفرد گذاشتید که در واقع باید به این شکل باشه  :

related_game = game.objects.get_queryset().filter(categories__game=games).distinct()

شما نمونه مد نظرتون برای game رو گرفتید و بجای اینکه اسمش رو بزارید game گذاشتید games

اینجا هم شما دارید میگید بازی هایی رو بیاره که دسته بندیشون با نمونه شما (games) یکیه پس باید games بزارید تا کار کنه 

اسم مدل شما game هستش و اون game که گذاشتید رو با خود مدل اشتباه میگیره و ارور هم به همین خاطره

نامگذاری ها خیلی در روند پروژه تاثیر داره 

موضوع آخر همیشه اسم کلاس هاتون رو upper case بزارید یعنی Game تا مشخص بشه مدل اصلی ما هست

موفق باشید


  • 1400/02/14
  • ساعت 01:34

داش ممنون بابت توضیح خوبت ولی بازم به ارور گرفتم 

views
def product_detail(request, *args, **kwargs):
    selected_game_id = kwargs['gameId']

    games = game.objects.get_by_id(selected_game_id)

    if games is None or not games.active:
        raise Http404('محصول مورد نظر یافت نشد')

    related_game = game.objects.get_queryset().filter(categories__game=games).distinct()

    galleries = GameGallery.objects.filter(game_id=selected_game_id)
    link = DownloadGame.objects.filter(game_id=selected_game_id)

    context = {
        'games': games,
        'galleries': galleries,
        'link': link,
        'related_game': related_game
    }

    return render(request, 'products/product_detail_game.html', context)
template
{% for group in related_game %}
                        {% for game in group %}
                            <div class="slide">
                                <div class="panel panel-default" style="margin:0;padding-left: 40px">
                                    <img src="{% static 'images/5.jpg' %}" class="img-responsive imgfluid"/>
                                    <div class="panel-body" style="margin: 0">
                                        <h4 style="margin:0;padding-top: 10px">clash of clans</h4>

                                        <button class="btn btn-info1 btn-cs button-cs">
                                            <svg style="margin-left: 10px;padding-right: 0"
                                                 xmlns="http://www.w3.org/2000/svg"
                                                 width="16" height="16" fill="currentColor"
                                                 class="bi bi-download" viewBox="0 0 16 16">
                                                <path d="M.5 9.9a.5.5 0 0 1 .5.5v2.5a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-2.5a.5.5 0 0 1 1 0v2.5a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2v-2.5a.5.5 0 0 1 .5-.5z"/>
                                                <path d="M7.646 11.854a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V1.5a.5.5 0 0 0-1 0v8.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3z"/>
                                            </svg>
                                            دانلود
                                        </button>
                                        +3
                                        <span class="fa fa-star checked"></span>
                                        <span class="fa fa-star checked"></span>
                                        <span class="fa fa-star checked"></span>
                                        <span class="fa fa-star"></span>
                                        <span class="fa fa-star"></span>

                                    </div>
                                </div>
                            </div>
                        {% endfor %}
                    {% endfor %}

بعد داش اون games هم سره اینکه فک کردم به گفته خودت قاطی میکنه عوض کردم که ارور درست شه دیدم ارور همونه فرق نکرد دوباره برگردوندم به همون games


  • 1400/02/14
  • ساعت 01:56

اون my_grouper رو حذف کردی از view

برای همین توی template دیگه نیازی به هردوی اینا نداری  :

{% for group in related_game %}
                        {% for game in group %}

باید اینجوری بشه :

{% for game in related_game %}

  • 1400/02/14
  • ساعت 02:01

وقتی میگی :

{% for group in related_game %}

ما میدونیم داخل related_game از جنس خود game وجود داره دسته ؟

پس اون group هم از جنس game هست

ارور به این خط گیر  میده :

{% for game in group %}

چون داریم میگیم به ازای هر game که داخل یک نمونه ای از game هست (group) 

ارور هم میگه نمیتونه روی نمونه game حلقه بزنی

توی حالت اول از my_grouper استفاده کرده بودی که گروه بندی میکرد پس باید دو تا حلقه میزدی


logo-samandehi