],python,django,django-models,django-views,django-templates"/>

首页 > 解决方案 > ValueError 无法分配“]

问题描述

我是一名学习 Django 的学生。我想实现以便在订购产品时收到订单(加入模型)数据库中的产品代码,但这很困难,因为我不断收到类似标题的错误。我想我会死,因为它没有解决太久。当我使用 product.object.all() 时,所有查询集都被加载,即使我使用过滤器,也会发生错误。我怎么解决这个问题?如果您能回复,那就太荣幸了。

错误信息

ValueError at /join/element_detail/ 无法分配“<QuerySet [<Product: 학잠>, <Product: 헤라 블랙쿠션>, <Product: 종근당 활력 비타민B>, <Product: 코디 순수 3겹데코>, <Product: 다이어리>, <Product: 화이트 스탠드 조명>, <Product: 파이썬 웹 프로그래밍 교재>, <Product: 나이키 후드집업>]>": "Join.product_code" 必须是"Product.instance"

join / views.py

join.product_code = product

这部分似乎是问题所在。

模型.py

class Product(models.Model):
    product_code = models.AutoField(primary_key=True)
    username = models.ForeignKey(Member, on_delete=models.CASCADE, db_column='username')
    category_code = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, related_name='products')
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True, unique=False, allow_unicode=True)
    image = models.ImageField(upload_to='products/%Y/%m/%d', blank=True)
    benefit = models.TextField()
    detail = models.TextField()
    target_price = models.IntegerField()
    start_date = models.DateField()
    due_date = models.DateField()

    class Meta:
        ordering = ['product_code']
        index_together = [['product_code', 'slug']]

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('zeronine:product_detail', args=[self.product_code, self.slug])


class Join(models.Model):
    join_code = models.AutoField(primary_key=True)
    username = models.ForeignKey(Member, on_delete=models.CASCADE, db_column='username')
    product_code = models.ForeignKey(Product, on_delete=models.CASCADE, db_column='product_code')
    part_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(self.join_code)

    class Meta:
        ordering = ['join_code']

我的猜测是这部分有问题。(join/views.py)我认为在接收产品的过程中出现了问题,但我不知道如何。

加入/views.py

def element_detail(request):
    designated_object = Designated.objects.all()
    element_object = Element.objects.all()
    value_object = Value.objects.all()
    product = Product.objects.all()

    if request.method == "POST":
            join = Join()
            join.product_code = product
            join.username = request.user
            join.part_date = timezone.now()
            join.save()


            return render(request, 'zeronine/list.html')


    return render(request, 'zeronine/detail.html', {'designated_object': designated_object,
                                                    'element_object': element_object,
                                                    'value_object': value_object})

zeronine/views.py

def product_in_category(request, category_slug=None):
    current_category = None
    categories = Category.objects.all()
    products = Product.objects.all()

    if category_slug:
        current_category = get_object_or_404(Category, slug=category_slug)
        products = products.filter(category_code=current_category)

    return render(request, 'zeronine/list.html', {'current_category': current_category,
                                                  'categories':categories,
                                                  'products':products})

def product_detail(request, id, product_slug=None):
    current_category = None
    categories = Category.objects.all()
    products = Product.objects.all()
    product = get_object_or_404(Product, product_code=id, slug=product_slug)
    designated_object = Designated.objects.filter(rep_price='True')
    element_object = Element.objects.all()
    value_object = Value.objects.all()

    return render(request, 'zeronine/detail.html', {'product':product,
                                                    'products':products,
                                                    'current_category': current_category,
                                                    'categories':categories,
                                                    'designated_object': designated_object,
                                                    'element_object':element_object,
                                                    'value_object':value_object})

zeronine/detail.html

        <form method="POST" style="margin-left: 110px;" action="{% url 'zeronine:element_detail' %}">
                    <div class="form-group row">
                        <label for="value_code" class="col-sm-2 col-form-label"><b>옵션</b></label>
                        <div class="col-sm-5">
                            <select type="text" class="form-control" name="value_code" id="value_code">
                                {% for value in value_object %}
                                {%if value.product_code == product %}
                                    <option value="{{value.value_code}}">{{value.name}}</option>
                                    {% endif %}
                                {% endfor %}
                            </select>
                        </div>
                    </div>

                {% csrf_token %}
                 {% if not user.is_authenticated %}
                <a onclick="alert('로그인 후 참여가 가능합니다.');" style="cursor:pointer;">
                    <button type="submit" style="background:black; border-color:black;" class="btn btn-primary">&nbsp;참여하기</button></a>

                <a onclick="alert('로그인 후 찜하기가 가능합니다.');" style="cursor:pointer;">
                    <button type="submit" style="background:white; color:black; border-color:black;" class="btn btn-primary">찜하기&lt;/button></a>

                  {% else %}
                <a onclick="alert('{{ product.name }} 공동구매 참여가 완료되었습니다.');" style="cursor:pointer;">
                    <button type="submit" action="{% url 'zeronine:element_detail' %}" style="background:black; border-color:black;" class="btn btn-primary">&nbsp;참여하기</button></a>
                <a onclick="alert('{{ product.name }} 상품을 찜했습니다.');" style="cursor:pointer;">
                    <button type="submit" style="background:white; color:black; border-color:black;" class="btn btn-primary">찜하기&lt;/button></a>
                  {% endif %}
            </form>

标签: pythondjangodjango-modelsdjango-viewsdjango-templates

解决方案


    def element_detail(request):
        designated_object = Designated.objects.all()
        element_object = Element.objects.all()
        value_object = Value.objects.all()
        product = Product.objects.all()
    
        if request.method == "POST":
                product_id = request.POST.get('value_code') # new
                product = Product.objects.get(product_code=product_id) # new
# Or 
        #product_ids = request.POST.getlist('value_code')
        #products = Product.objects.filter(product_code__in=product_ids)
        #loop all products and save example;
        #for product in products:
        #   join = Join()
        #   join.product_code = product
        #   join.username = request.user
        #   join.part_date = timezone.now()
        #   join.save()
                join = Join()
                join.product_code = product
                join.username = request.user
                join.part_date = timezone.now()
                join.save()
    
    
                return render(request, 'zeronine/list.html')

编辑以包含模板中的多个值,我当然假设。


推荐阅读