使用Django 1.6动态实现产品上传

时间:2014-04-25 00:34:36

标签: python ajax django

所以我使用我的管理界面为我网站上的不同项目添加产品信息。我希望将模型中的产品信息添加到模板视图中,但我希望每次使用管理界面添加新产品时,模板都会生成一个新的Li标签,其中包含当前产品信息和使用的图片在管理界面中输入的数据。

我还没有在我的views.py中实现任何模板逻辑,但我很难理解如何真正完成整个过程。那么有人可以帮助指导我如何实施这个解决方案吗?

谢谢!

以下是我的代码:

Models.py

from __future__ import unicode_literals

from django.db import models
from django.utils.translation import ugettext_lazy as _

import datetime

class Designer(models.Model):
    name = models.CharField(max_length=254, blank=True, null=True)
    label_name = models.CharField(max_length=254, blank=True, null=True)
    description = models.TextField(null=True, blank=True)
    specialites = models.CharField(max_length=254,  null=True, blank=True)
    image = models.ImageField(upload_to='images/designers/main',max_length=100, null=True) #For the argument upload_to, will add to the static folder and generated image will be stored in suing that path specified

    #For Admin Purposes, to track and see which if still active by for administrative users only
    is_active = models.BooleanField(default=True)


    #Metadata
    class Meta:
       verbose_name = _("Designer Information")
       verbose_name_plural = _("Designers")

    #Helps return something meaningful, to show within the admin interface for easy interaction
    def __unicode__(self):
        return "{0} {1}".format(self.name, self.label_name)

class Boutique(models.Model):
    name = models.CharField(max_length=254, blank=True, null=True)
    address = models.CharField(max_length=255, blank=True, null=True)    
    city = models.CharField(max_length=50, null=True, blank=True)
    state = models.CharField(max_length=2, null=True, blank=True)
    zipcode = models.IntegerField(max_length=5, null=True, blank=True)
    boutique_website = models.URLField(max_length=200,  null=True, blank=True)

    #For Admin Purposes, to track a product to see which is active by administrative users
    is_active = models.BooleanField(default=True)

    #Foreign Keys & other relationships
    designer = models.ForeignKey(Designer)

    #Metadata
    class Meta:
      verbose_name = _("Boutique Information")
      verbose_name_plural = _("Boutiques")

    #Helps return something meaningful, to show within the admin interface for easy interaction
    def __unicode__(self):
        return "{0}, {1}, {2}".format(self.name, self.city, self.state)

class ProductCategory(models.Model):
    name = models.CharField(max_length=255L, blank=True, null=True)
    slug = models.SlugField(max_length=50, unique=True, help_text='Unique value for product page URL, created from name.')

    #For Admin Purposes, to track and see which if still active by for administrative users only
    is_active = models.BooleanField(default=True)

    #For Admin Purposes, to track when we add each product and each product was updated by administrative users
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    #Metadata
    class Meta:
        verbose_name = _("Product Category")
        verbose_name_plural = _("Product Categories")

    #Helps return something meaningful, to show within the admin interface for easy interaction
    def __unicode__(self):
        return "{0}".format(self.name)

class Product(models.Model):
    name = models.CharField(max_length=254, blank=True, null=True)
    description = models.TextField(blank=True, null=True)    
    color_name = models.CharField(max_length=254, null=True, blank=True)
    size_types = models.CharField(max_length=7, null=True, blank=True)
    product_price = models.DecimalField(max_digits=9,decimal_places=2)
    old_price = models.DecimalField(max_digits=9,decimal_places=2, blank=True,default=0.00) #To show original price if, new price has been added
    product_tags = models.CharField(max_length=254, null=True, blank=True, help_text='Comma-delimited set of SEO keywords for product tag area')
    novelty = models.CharField(max_length=254, null=True, blank=True)
    product_website = models.URLField(max_length=200,  null=True, blank=True) #To show other sites to Users, where they can purchase the particular product
    image = models.ImageField(upload_to='images/products/main',max_length=100, null=True) #For the argument upload_to, will add to the static folder and generated image will be stored in suing that path specified
    slug = models.SlugField(max_length=255, unique=True, help_text='Unique value for product page URL, created from name.')

  #This shows when each item was uploaded & by who, to the User 
    uploaded_by = models.CharField(max_length=254, blank=True, null=True)
    uploaded_at = models.DateTimeField(auto_now=True)

  #For Admin Purposes, to track and see which if still active by for administrative users only
    is_active = models.BooleanField(default=True)

    #Foreign Keys & other relationships
    designer = models.ForeignKey(Designer)
    boutique = models.ForeignKey(Boutique)
    category = models.ForeignKey(ProductCategory)

    #Metadata
    class Meta:
        verbose_name = _("Product")
        verbose_name_plural = _("Products")

    #Helps return something meaningful, to show within the admin interface for easy interaction
    def __unicode__(self):
        return "{0}".format(self.name)

Admin.py

from __future__ import unicode_literals

from django.contrib import admin
from products.models import Designer, Product, ProductCategory, Boutique


class DesignerAdmin(admin.ModelAdmin):

    list_display = ["name", "label_name", "description", "specialites", "image", "is_active"]
    search_fields = ["name", "label_name"]
    list_per_page = 50

class ProductAdmin(admin.ModelAdmin):

    list_display = ["name", "description", "color_name", "size_types", "product_price", "old_price", "product_tags", "novelty","product_website", "image", "slug", "uploaded_by", "uploaded_at", "is_active"]
    search_fields = ["name", "product_price"]
    list_per_page = 25

class ProductCategoryAdmin(admin.ModelAdmin): 

    list_display = ["name", "slug", "is_active", "created_at", "updated_at"]
    search_fields = ["name"]
    list_per_page = 25

class BoutiqueAdmin(admin.ModelAdmin):

    list_display = ["name", "address", "city", "state", "zipcode", "boutique_website", "is_active"]
    search_fields = ["name"]
    list_per_page = 10


#Register Models below
admin.site.register(Boutique, BoutiqueAdmin)
admin.site.register(Designer, DesignerAdmin)
admin.site.register(Product, ProductAdmin)
admin.site.register(ProductCategory, ProductCategoryAdmin)

Forms.py

from __future__ import unicode_literals

from django import forms

from django.forms import extras, ModelForm

from products.models import Designer, Product, ProductCategory, Boutique

class DesignerForm(ModelForm):
    class Meta:
        model = Designer

class ProductForm(ModelForm):
    class Meta:
        model = Product

class BoutiqueForm(ModelForm):
    class Meta:
        model = Boutique

class ProductCategoryForm(ModelForm):
    class Meta:
        model = ProductCategory

Views.Py

from __future__ import unicode_literals

from django.http import Http404, HttpResponseForbidden
from django.shortcuts import redirect, get_object_or_404
from django.utils.http import base36_to_int, int_to_base36
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _
from django.views.generic.base import TemplateResponseMixin, View
from django.views.generic.edit import FormView

from django.contrib import auth, messages
from django.contrib.sites.models import get_current_site
from django.shortcuts import render

from products.forms import ProductForm, ProductCategoryForm
from products.forms import BoutiqueForm
from products.forms import DesignerForm

from products.models import Boutique, Product, ProductCategory, Designer



class ProductView(FormView):

    template_name = "product_detail/product.html"
    form_class = ProductForm
    template_var={}


    def __init__(self, *arg):
        super(ProductView, self).__init__()
        self.arg = arg



class ProductCategoryView(FormView):

    form_class = ProductCategoryForm
    template_var={}


    def __init__(self, *arg):
        super(ProductCategory, self).__init__()
        self.arg = arg

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用Django基于通用类的视图中的简单ListView

首先,将views.py

串起来
from django.views.generic import ListView

class ProductListView(ListView):

    model = Product
    template_name = 'product/list_view.html' # Edit this to whatever your template is.

请记住修改urls.py

from .views import ProductListView

urlpatterns = patterns('',
    ...
    url(r'^product/$', ProductListView.as_view(), name='list'), # Edit url path and name as desired
    ...
)

然后,制作模板:

<div class="jumbotron">
    <ul>
    {% for product in products %}
        <li>{{ product.name }}: {{ product.description }} <img src="{{ product.image.url }}" >
    {% endfor %}
    </ul>
</div>

这是一个非常基本的模板,您显然希望自定义。对于数据库中的每个Product,它将显示名称,描述和图像。您可以根据需要自定义字段。

其他潜在问题:

1)请务必在ListView

中提供模板的正确路径

2)设置MEDIA_URL和其他媒体设置,以便显示Product图片。

3)查看ListView中的其他自定义选项(请参阅文档here。)