2016-02-07 44 views
5

Próbuję przekonwertować tytuł postu na CamelCase, aby utworzyć hashtag Twittera, używam paska, ale jego zwracanie obiektu zamiast tego nie wiem czy to jest właściwa droga?Konwertuj tytuł posta na CamelCase

# views.py 
def post_create(request): 
    if not request.user.is_authenticated(): 
     raise Http404 

    form_class = PostCreateForm 
    if request.method == 'POST': 

     form = form_class(request.POST, request.FILES) 
     if form.is_valid(): 

      instance = form.save(commit=False) 
      instance.creator = request.user 
      instance.slug = slugify(instance.title) 
      instance.hashtag = instance.title.strip() 
      instance.save() 


      slug = slugify(instance.title) 
      return redirect(instance.get_absolute_url()) 

    else: 
     form = form_class() 

    context = { 
     'form': form, 
    } 

    return render(request, "posts/post_create.html", context) 

Które zwraca <built-in method strip of unicode object at 0x031ECB48> w szablonie var wynik szukam jest tak MyPostTitle do szablonu

# Template view 
    <h3>#{{instance.hashtag|title}}</h3> 

models.py

class Post(models.Model): 
    creator = models.ForeignKey(ProfileUser) 
    title = models.CharField(max_length=80) 
    hashtag = models.CharField(max_length=80) 
    slug = models.SlugField(unique=True) 

    def __unicode__(self): 
     return self.title 

    def get_absolute_url(self): 
     return reverse("posts:detail", kwargs={"slug": self.slug}) 
+0

Czy możesz pokazać definicję modelu Posta? Dzięki. – alecxe

+0

Dodałem model Posta – linski

+0

OK, może to być to, że ja czegoś brakuje lub nie mam wystarczającej ilości kawy. Spróbuj usunąć pliki Pyc i zrestartuj serwer - wygląda na to, że działa on jako 'instance.title.strip' zamiast' instance.title.strip() '. – alecxe

Odpowiedz

3
>>> a = "foo baz bar" 
>>> "".join([s.capitalize() for s in a.rsplit()]) 
>>> FooBazBar 

Aby zapisać:

import re 
r = re.compile("[/!/?,:.;-]") 

t = r.sub(" ",instance.title) # clear punctuation 
instance.hashtag = "".join([s.capitalize() for s in t.rsplit()]) 
+1

To działa świetnie musiałem zmienić 'formularz' na' instancję' .hashtag jego pokazano camelcase – linski

4

strip usuwa tylko białe znaki od początku lub końca ciągu znaków (https://docs.python.org/2/library/string.html#string.strip). Można użyć

instance.hashtag = instance.title.replace(' ', '') 

Na marginesie, to może być czystsze, aby dodać tę funkcjonalność jako metoda klasy model:

class Post(models.Model): 
    ... 
    def hashtag(self): 
     if self.title is not None: 
      return self.title.replace(' ', '') 
+0

Awesome, funkcja hashtag działa lepiej. dzięki – linski

1

Klasa Unicode w języku Python ma również metodę title(), co oznacza, że ​​można wykonać:

$ python3 
>>> 'foo bar baz'.title() 
'Foo Bar Baz' 
>>> 'foo bar baz'.title().replace(' ', '') 
'FooBarBaz' 

Pamiętaj, że kolejność .title().replace() jest ważna!

+0

Dzięki, myślę, że ten jest jeszcze lepszy, ponieważ nie muszę python 'import re' mogę użyć metody title() . – linski