Джанго Вложенный админ - PullRequest
       38

Джанго Вложенный админ

0 голосов
/ 20 сентября 2019

вот мой код:

models.py

from django.db import models
class Country(models.Model):
    country_name = models.CharField(max_length = 20, default = '', )
    country_other_details = models.CharField(max_length = 100, default = '', null = True)
    class Meta:
        verbose_name_plural = "Countries"
    def __str__(self):
        return self.country_name

class State(models.Model):
    in_country = models.ForeignKey(Country, related_name='in_country',on_delete=models.DO_NOTHING)
    state_name = models.CharField(max_length = 20, default = '')
    state_other_details = models.CharField(max_length=100, default = '', null = True)
    def __str__(self):
        return self.state_name

class City(models.Model):
    in_state = models.ForeignKey(State, related_name='in_state',on_delete=models.DO_NOTHING)
    city_name = models.CharField(max_length = 20, default = '')
    city_other_details = models.CharField(max_length = 100, null = True)

    class Meta:
        verbose_name_plural = "Cities"

    def __str__(self):
        return self.city_name

forms.py

from django.forms.models import inlineformset_factory
from django.forms.models import BaseInlineFormSet

from .models import Country, State, City

from django.forms.models import BaseInlineFormSet, inlineformset_factory
from django.utils.translation import ugettext_lazy as _

# from publishing.utils.forms import is_empty_form, is_form_persisted

CityFormset = inlineformset_factory(State, City, extra=2,  fields=("city_name",))


class BaseStateFormset(BaseInlineFormSet):
    def add_fields(self, form, index):
        super(BaseStateFormset, self).add_fields(form, index)

        # save the formset in the 'nested' property
        form.nested = CityFormset(
            instance=form.instance,
            data=form.data if form.is_bound else None,
            files=form.files if form.is_bound else None,
            prefix='address-%s-%s' % (
                form.prefix,
                CityFormset.get_default_prefix()),
            # extra=1
        )

    def is_valid(self):
        result = super(BaseStateFormset, self).is_valid()

        if self.is_bound:
            for form in self.forms:
                if hasattr(form, 'nested'):
                    result = result and form.nested.is_valid()

        return result

    def save(self, commit=True):

        result = super(BaseStateFormset, self).save(commit=commit)

        for form in self.forms:
            if hasattr(form, 'nested'):
                if not self._should_delete_form(form):
                    form.nested.save(commit=commit)

        return result


StateFormset = inlineformset_factory(Country, State, formset=BaseStateFormset, extra=2, fields=("state_name",))

views.py

from .models import Country, State, City

def manage_state(request, parent_id):

parent = get_object_or_404(Country, id=parent_id)

if request.method == 'POST':
    formset = forms.StateFormset(request.POST, instance=parent)
    if formset.is_valid():
        formset.save()
        # return redirect('parent_view', parent_id=parent.id)
        return redirect(reverse('india:manage_state', kwargs={"parent_id": parent.id}))

else:
    formset = forms.StateFormset(instance=parent)

return render(request, 'home.html', {
              'parent':parent,
              'children_formset':formset})

То, что я хочу, это одна форма, которая создаст объект для модели Parent (Страна) и несколько объектов для Child (State) в соответствии с объектом страны и несколько объектов для Grand Child (City) в соответствии с соответствующим State

например:

<form method="POST">
    Parentform:(Country)
        <input name="country_name">


        Childform:(State)
            <input name="state_name">

            GrandChildform:(City)
                <input name = "City_name">

            <button> Add GrandChild</button>

        <button> Add Child </button>

    <button>Add Parent</button>

</form>

также кнопка добавления должна иметь возможность динамически добавлять больше стран, штатов и городов в форму.

Любая помощь, предложения или ссылки будут благодарны.Заранее спасибо.

1 Ответ

0 голосов
/ 23 сентября 2019

Я получил решение.Благодаря PYTHON и Django.

Как я понял, мы можем редактировать нашего собственного администратора, используя встроенный пакет django-nested-admin .

Мы не делаемтребуют создания пользовательских форм, представлений или чего-либо еще.

Я делюсь изображением моего Django-admin: Изображение

Для этого яделюсь описаниями:

Сначала мы устанавливаем пакет, используя pip:

pip install django-nested-admin.

Теперь мы добавляем библиотеку в settings.py :

INSTALLED_APPS[
    ...

    'nested_admin',

    ...
]

Добавьте URL-адреса библиотеки в urls.py :

url(r'^nested_admin/', include('nested_admin.urls')),

Зарегистрируйте модели в admin.py :

from django.contrib import admin
from .models import State, Country, City
from nested_admin import NestedModelAdmin, NestedStackedInline, NestedTabularInline


class CityTabularInline(NestedTabularInline):
    model = City
    extra = 1


class StateTabularInline(NestedTabularInline):
    model = State
    extra = 1
    inlines = [CityTabularInline, ]


class CountryAdmin(NestedModelAdmin):
    inlines = [StateTabularInline, ]

admin.site.register(Country, CountryAdmin)

Использование :

NestedModelAdmin: to extend the django ModelAdmin class and to be able to use differents
types of classes in the inlines attribute.

NestedStackedInline: to allow the addition of TabularInline classes in the inlines
attribute.

NestedTabularInline: to extend the TabularInline.

для получения более подробной информации, пожалуйста, Посетите .

...