Как правильно переопределить метод save () ModelForm для модели с ManyToManyField - PullRequest
2 голосов
/ 19 октября 2010

Считайте, что я определил следующие модели:

class Tag(models.Model):
  name = models.CharField(max_length=20)

class Entry(models.Model):
  title = models.CharField(max_length=100)
  date = models.DateField()
  tags = models.ManyToManyField(Tag)

и следующую модель:

class EntryForm(forms.ModelForm):
  tags =  CharField(max_length=100, label='Tags', required=False)
  class Meta:
    model = Entry

В основном у меня есть запись с тегами. Теги не обязательно уже созданы. Мне нужно получить заполненную форму заявки и сохранить ее с тегами.

Я могу сделать это легко, если у меня нет записи ManyToMany в Entry. Но с этим мне сначала нужно сохранить теги, затем добавить сохраненные теги к записи, а затем сохранить запись. Это означает, что я должен переопределить метод save () EntryForm.

Я уже видел этот вопрос, но он выглядит иначе. В моем случае мне нужно сохранять только теги, а остальные должны иметь возможность использовать функцию сохранения по умолчанию в ModelForm.

Я представил упрощенный пример. В реальном у меня есть намного больше полей в Entry. Какова ваша рекомендация для написания метода save () EntryForm способом django?

Ответы [ 2 ]

3 голосов
/ 20 октября 2010

Я думаю, что вы можете позвонить супер после сохранения тегов. Возможно, вам нужно добавить запись после ее создания.

def save(self, commit=True):
    # do custom stuff
    tags =[]
    for t in self.cleaned_data['tags'].split(','):
         tags.append(Tag.objects.get_or_create(name=t))
    # save entry
    e = super(EntryForm, self).save(commit=commit)

    for t in tags:
        e.tags.add(t)
1 голос
/ 10 февраля 2012

Лучший и правильный вариант здесь - добавить в форму метод clean_tags, а не переопределять save () в модели.

def clean_tags(self):
    tags = self.cleaned_data.get('tags', None)

    clean_tags = []


    tags = [tag.strip() for tag in tags.split(',') if tags]

    for tag in tags:
        t, created = Tag.objects.get_or_create(title=tag)
        t.count = F('count') + 1
        t.user.add(self.cleaned_data['user'])
        t.save()
        clean_tags.append(t)

    return clean_tags
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...