Джанго Сохранение форм - PullRequest
0 голосов
/ 08 апреля 2019

Я хотел бы поделиться с вами своим кодом, чтобы найти решение.У меня есть Django form.Я хотел бы сохранить данные, только если нет другого объекта с такими же данными.Другими словами, объекты должны быть уникальными.

Если объект не существует, я сохраняю его, иначе я отображаю форму с сообщением об ошибке «Объект уже существует с этими функциями».

Это моя модель:

def guide_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/guides/<guide_id>
    new_filename = f'guides/{instance.site.id}'
    if instance.profile_type:
        new_filename += f'_{instance.profile_type}'
    if instance.profile_level:
        new_filename += f'_{instance.profile_level}'
    if instance.language:
        new_filename += f'_{instance.language}'
    name, ext = os.path.splitext(filename)
    if ext:
        new_filename += ext

    return new_filename


class UserGuide(models.Model):
    """ A class for storing user guides depending on profiles """
    objects = models.Manager()

    site = models.ForeignKey(WebApplication, on_delete=models.PROTECT, related_name='guides',
                             verbose_name=_('application'))
    file = models.FileField(verbose_name='file', upload_to=guide_path)
    profile_type = models.CharField(verbose_name=_('profile type'), choices=UserProfile.USER_TYPES, max_length=2,
                                    null=True, blank=True)
    profile_level = models.CharField(verbose_name=_('profile level'), choices=UserProfile.USER_ROLES, max_length=2,
                                     null=True, blank=True)
    language = models.CharField(verbose_name=_('language'), choices=settings.LANGUAGES, max_length=2, default='en')

    class Meta:
        verbose_name = _('user guide')
        verbose_name_plural = _('user guides')
        unique_together = ('site', 'profile_type', 'profile_level', 'language')

Это моя форма:

class UserGuideForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    class Meta:
        model = UserGuide
        fields = ['site', 'file', 'profile_type', 'profile_level', 'language']
        widgets = {
            'file': CustomFileInput(attrs={'class': 'clearablefileinput'}),
        }

И это мое мнение:

class UserGuideUpdateView(UpdateView):
    """ Display a form to create a userguide

        **Context**

        ``subtitle``
            Title of the page

        **Template:**

        :template:`app/generic_form.html`
    """
    model = UserGuide
    form_class = UserGuideForm
    success_url = reverse_lazy('userguide-list')
    template_name = 'app/form_userguide.html'
    permission_required = 'app.change_userguide'

    def get_object(self, queryset=None):
        pk = self.kwargs.get('pk')
        return get_object_or_404(UserGuide, pk=pk)

    def get_title(self):
        return _('Edit user guide: ')

    def get_context_data(self, **kwargs):
        context = super(UserGuideUpdateView, self).get_context_data(**kwargs)
        context.update({
            'subtitle': self.get_title(),
        })
        return context

    def form_valid(self, form):
        site = form.cleaned_data['site']
        file = form.cleaned_data['file']
        profile_type = form.cleaned_data['profile_type']
        profile_level = form.cleaned_data['profile_level']
        language = form.cleaned_data['language']

        userguide = UserGuide.objects.filter(site=site.id, profile_type=profile_type, profile_level=profile_level, language=language)
        if userguide.exists():
            messages.error(self.request, _('A user guide for that profile and language already exists'))
            HttpResponseRedirect(self.template_name)
        else:
            pass
        return super().form_valid(form)

Как я могу добавить условие, если мой объект уже существует, не сохранить форму и вернуть форму с сообщением об ошибке?

Спасибо

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