Python 字符串值分割

1 投票
1 回答
5821 浏览
提问于 2025-04-15 16:38

我正在用Python和Django这个很棒的框架搭建一个网站,但我对Python还不太熟悉。我想把从数据库返回的一个字符串分开,具体是想在第一个空格出现的时候进行分割,所以我试了下面的代码,

{{product.name.split(' ' ,1)}}

但是这并没有成功,我得到了这个错误信息,

    Environment:

Request Method: GET
Request URL: http://website.co.uk/products/
Django Version: 1.1.1
Python Version: 2.5.2
Installed Applications:
['django.contrib.auth',
 'django.contrib.admin',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'website.news',
 'website.store_locator',
 'website.css_switch',
 'website.professional',
 'website.contact',
 'website.shop',
 'tinymce',
 'captcha']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware')


Template error:
In template /var/www/website/src/website/shop/templates/category.html, error at line 6
   Could not parse the remainder: '(' ',1)' from 'product.name.split(' ',1)'
   1 : {% extends "shopbase.html" %}


   2 : {% block pageid %}shop{%endblock%}


   3 : {% block right-content %}


   4 :  <div class="products">


   5 :  <form method="post" action="{% url category category.slug %}">


   6 :   {% for product in category.products.all %} 


   7 :      <div class="{% cycle 'clear' '' '' %}">


   8 :          <img src="{{MEDIA_URL}}{{product.mini_thumbnail}}" alt="{{product.name}}" class="thumbnail"/>


   9 :          <div class="prod-details">


   10 :             <h3><a href="{% url shop.views.product category.slug product.slug %}">{{product.name.split(' ',1)}}</a></h3>


   11 :             <p class="strap">{{ product.strap }}</p>


   12 :             <ul>


   13 :                 <li class="price">&pound;{{product.price}}</li>


   14 :                 <li class="quantity">


   15 :                     <select name="quantity_{{product.id}}">


   16 :                         <option label="1" value="1">1</option>


Traceback:
File "/usr/lib/python2.5/site-packages/django/core/handlers/base.py" in get_response
  92.                 response = callback(request, *callback_args, **callback_kwargs)
File "/var/www/website/src/website/shop/views.py" in home
  716.     return category(request, Category.objects.root_category(), data={'pageclass':'stylers'})
File "/var/www/website/src/website/shop/views.py" in category
  738.     return render_to_response(template, data, RequestContext(request))
File "/usr/lib/python2.5/site-packages/django/shortcuts/__init__.py" in render_to_response
  20.     return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
File "/usr/lib/python2.5/site-packages/django/template/loader.py" in render_to_string
  103.         t = get_template(template_name)
File "/usr/lib/python2.5/site-packages/django/template/loader.py" in get_template
  82.     template = get_template_from_string(source, origin, template_name)
File "/usr/lib/python2.5/site-packages/django/template/loader.py" in get_template_from_string
  90.     return Template(source, origin, name)
File "/usr/lib/python2.5/site-packages/django/template/__init__.py" in __init__
  168.         self.nodelist = compile_string(template_string, origin)
File "/usr/lib/python2.5/site-packages/django/template/__init__.py" in compile_string
  189.     return parser.parse()
File "/usr/lib/python2.5/site-packages/django/template/__init__.py" in parse
  285.                     compiled_result = compile_func(self, token)
File "/usr/lib/python2.5/site-packages/django/template/loader_tags.py" in do_extends
  169.     nodelist = parser.parse()
File "/usr/lib/python2.5/site-packages/django/template/__init__.py" in parse
  285.                     compiled_result = compile_func(self, token)
File "/usr/lib/python2.5/site-packages/django/template/loader_tags.py" in do_block
  147.     nodelist = parser.parse(('endblock', 'endblock %s' % block_name))
File "/usr/lib/python2.5/site-packages/django/template/__init__.py" in parse
  285.                     compiled_result = compile_func(self, token)
File "/usr/lib/python2.5/site-packages/django/template/defaulttags.py" in do_for
  688.     nodelist_loop = parser.parse(('empty', 'endfor',))
File "/usr/lib/python2.5/site-packages/django/template/__init__.py" in parse
  266.                 filter_expression = self.compile_filter(token.contents)
File "/usr/lib/python2.5/site-packages/django/template/__init__.py" in compile_filter
  358.         return FilterExpression(token, self)
File "/usr/lib/python2.5/site-packages/django/template/__init__.py" in __init__
  538.             raise TemplateSyntaxError("Could not parse the remainder: '%s' from '%s'" % (token[upto:], token))

Exception Type: TemplateSyntaxError at /products/
Exception Value: Could not parse the remainder: '(' ',1)' from 'product.name.split(' ',1)'

我猜这意味着我可以直接在模板里做我想做的事情?但这就是我遇到的问题,因为我不知道该在视图的哪个地方进行操作。我希望有人能给我指个方向。

这是我的视图,

def home(request):
    """
    The home page, borrows functionality from category
    """
    return category(request, Category.objects.root_category(), data={'pageclass':'stylers'})

def category(request, category_slug, template='category.html', data={}):
    """
    Display a category in the store
    """
    import re

    category = get_object_or_404(Category, slug=category_slug)
    basket = Basket(request)

    if request.method == "POST":
        for k, v in request.POST.iteritems():
            match = re.match('^add_to_basket_([0-9])+$',k)
            if match:
                id = match.group(1)
                basket.add_item(Product.objects.get(id=id), request.POST['quantity_%s' % id])
                break
        return HttpResponseRedirect(reverse('basket'))

    data['category'] = category

    return render_to_response(template, data, RequestContext(request))

def product(request, category_slug, product_slug):
    """
    Display a product in the store, nominated by product_slug, that is in the
    category nominated by category_slug
    """

    data = {'pageclass':'irons'}

    category = get_object_or_404(Category, slug=category_slug)
    product = get_object_or_404(Product, slug=product_slug)

    basket = Basket(request)

    if request.method == "POST":
        basket.add_item(product, request.POST['quantity'])
        return HttpResponseRedirect(reverse('basket'))

    data['category'] = category
    data['product'] = product

    return render_to_response('product.html', data, RequestContext(request))

如果需要我的模型,我可以随时提供。

我真的希望有人能帮帮我。

非常感谢!

1 个回答

11

你可以用 {{ }} 来调用方法,但这个方法不能需要任何参数。

在这种情况下,我建议你在模型上添加一个方法来实现你想要的功能。比如:

class Product(models.Model):
    ...
    def get_first_name(self):
        if self.name:
           return self.name.partition(' ')[0]

        return None

然后,在你的模板中,你可以这样调用它:{{ product.get_first_name }}

另外一个选择是写一个自定义过滤器,这样会稍微复杂一点。想了解更多信息,可以查看 Django 关于自定义模板标签的文档

撰写回答