Как: Джанго Парлер CRUD Формы - PullRequest
0 голосов
/ 30 октября 2019

Я использую Parler для локализации моих моделей.

Django Admin работает нормально, но теперь я хочу воссоздать административные формы во внешнем интерфейсе.

Пока что я могу создать новую модель, но она всегда создается на языке по умолчанию. Теперь вопрос в том, как мне установить язык?

В лучшем случае я могу выбрать язык с помощью <select> в форме, но значение по умолчанию будет установлено параметром get language=iso_code или, если проще, использовать языковые вкладки, как в Django Admin.

РЕДАКТИРОВАТЬ: Проблема, кажется, где-то в классе формы.

Модель

class Category(MPTTModel, TranslatableModel):
    title = TranslatedField(any_language=True)
    description = TranslatedField()
    slug = TranslatedField()
    parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children',
                            db_index=True)

    objects = CategoryManager()

    def save(self, *args, **kwargs):
        super(Category, self).save(*args, **kwargs)


class CategoryTranslation(TranslatedFieldsModel):
    title = models.CharField(max_length=200)
    description = models.TextField(null=True)
    slug = models.SlugField()

    master = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='translations')

    class Meta:
        unique_together = (
            ('language_code', 'slug'),
        )

Вид

@method_decorator(login_required, name='dispatch')
class CategoriesCreateView(TranslatableCreateView):
    model = Category
    context_object_name = 'categories'
    template_name = 'categories/update.html'
    form_class = CategoryForm
    object = Category()

    def get(self, request, *args, **kwargs):
        request.DEFAULT_LANGUAGE = LANGUAGE_CODE
        request.meta_title = _('Create Category')
        return super().get(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        request.DEFAULT_LANGUAGE = LANGUAGE_CODE
        request.meta_title = _('Create Category')
        return super().post(request, *args, **kwargs)

Форма

class CategoryForm(TranslatableModelForm):
    use_required_attribute = False

    title = TranslatedField()
    description = TranslatedField()
    slug = TranslatedField()
    parent = TreeNodeChoiceField(queryset=Category.objects.all())

    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.form_method = 'post'
        self.helper.form_action = '.'
        self.helper.form_class = 'form-horizontal form-bordered'
        self.helper.label_class = 'col-lg-3'
        self.helper.field_class = 'col-lg-8'

        self.helper.layout = self.__get_layout()
        super().__init__(*args, **kwargs)
        self.fields['parent'].required = False

    @staticmethod
    def __get_layout():
        layout = Layout(
            Field('parent'),
            Field('title'),
            Field('slug'),
            Field('description'),
            ButtonHolder(
                Submit('submit', _('Save'))
            )
        )
        return layout

    class Meta:
        model = Category
        fields = ['title', 'description', 'slug', 'parent']

1 Ответ

0 голосов
/ 30 октября 2019

Черт, конечно, решение очень простое.

Проблема была в том, что self.helper.form_action = '.' переопределяет все параметры получения, включая язык / перевод.

...