2016-02-07 19 views
5

Sto provando a convertire un titolo di post in CamelCase per creare un hashtag di twitter, sto usando strip ma il suo ritorno di un oggetto invece non so se questo è il modo giusto?Converti il ​​titolo del post in 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) 

che restituisce <built-in method strip of unicode object at 0x031ECB48> nel modello var, il risultato che sto cercando è come questo MyPostTitle nel modello

# 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

Potrebbe mostrare la definizione del modello Post? Grazie. – alecxe

+0

Ho aggiunto il modello Post – linski

+0

Ok, potrebbe essere che mi manca qualcosa o non ho abbastanza caffè. Prova a rimuovere i file pyc e riavviare il server: sembra proprio che sia in esecuzione come 'instance.title.strip' invece di' instance.title.strip() '. – alecxe

risposta

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

Per salvare:

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

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

Questo funziona benissimo ho dovuto cambiare 'form' in' instance'.hashtag la sua mostra camelcase – linski

4

strip rimuove solo il spazio bianco dall'inizio o alla fine della stringa (https://docs.python.org/2/library/string.html#string.strip). Si potrebbe utilizzare

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

Come nota a margine, potrebbe essere più pulito per aggiungere questa funzionalità come un metodo alla classe del modello:

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

Impressionante, la funzione hashtag funziona meglio. grazie – linski

1

La classe Unicode di Python ha anche un metodo title(), il che significa che si può fare:

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

Si noti che l'ordine di .title().replace() è importante!

+0

Grazie, penso che questo sia ancora meglio perché non devo python 'import re' Posso usare il metodo title() . – linski

Problemi correlati