Próbuję zapisać dane formularza wprowadzone przez użytkownika. Chciałbym sfałszować "imię", która została wprowadzona przez użytkownika, ale nie chcesz pola Silug, aby pokazać na szablonie, który widzi użytkownika. Próbowałem to zrobić ręcznie z funkcją sprzedaży, którą widzisz poniżej, ale nie mogę go do pracy. Chcę ostatecznie zapisać sfałszowaną nazwę w modelu przedmiotu, który wymieniłem poniżej. Jestem pewien, że istnieje znacznie mądrzej / prostszy sposób niż funkcja sprzedaży, której obecnie używam: str. Z góry dziękuję!

class Item(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=75)
    slug = models.SlugField(max_length=50, unique=True)
    is_active = models.BooleanField(default=True)
    image =  models.CharField(max_length=50)
    price = models.DecimalField(max_digits=9, decimal_places=2)
    quantity = models.IntegerField(default=1)
    description = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    shipping_price = models.DecimalField(decimal_places=2, max_digits=6)
    categories = models.ManyToManyField(Category)


class AddItem(forms.ModelForm):
    class Meta:
        model = Item
        exclude = ('user','slug','is_active',)

def sell(request):
        if request.method == "POST":
            form = AddItem(request.POST)
            item = form.save(commit=False)
            item.user = request.user
            item.is_active = True
            item.slug = slugify(form.name) **#not sure what this line should be?** 
            item.save()
            if form.is_valid():
                form.save()
                return HttpResponseRedirect('thanks.html')
            else:
                url = urlresolvers.reverse('register')
                return HttpResponseRedirect(url)
0
Jonathan 8 sierpień 2012, 08:36

2 odpowiedzi

Najlepsza odpowiedź

Możesz wykluczyć ślimak z formularza użytkownika. I podpalili się w sygnale pre_save.

from django.dispatch import receiver
from django.db.models.signals import pre_save

@receiver(pre_save, sender=Item)
def iter_pre_save_handler(sender, instance, **kwargs):
    if not instance.pk:
        instance.slug = slugify(instance.name)
3
Zapix 8 sierpień 2012, 07:34

Według Dokumenty, możesz wykluczyć pole od renderowania w formie modelu:

class PartialAuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ('name', 'title')

Lub

class PartialAuthorForm(ModelForm):
    class Meta:
        model = Author
        exclude = ('birth_date',)

Lub ustawienie edycji = false w instancji pola w modelu.

Po wykonaniu tego możesz zastąpić metodę Zapisz modelu, ponieważ sugerowały komentarze w OP:

#  shamelessly copied from http://stackoverflow.com/questions/837828/how-do-i-create-a-slug-in-django/837835#837835
from django.template.defaultfilters import slugify

class test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()

    def save(self, *args, **kwargs):
        self.s = slugify(self.q)
        super(test, self).save(*args, **kwargs)
0
XORcist 8 sierpień 2012, 07:09