@paevlk2007

Как в forms получить разный initial модели, если virew одна, форма одна, разные urls?

Привет!

models.py
class Models_view(models.Model):
    view_name = models.CharField(max_length=100)

view_name = Вид1
view_name = Вид2
class Models_view(models.Model):
    name = models.CharField(max_length=100)
    models_views =  models.ForeignKey(Models_view)

forms.py
class ModelForm(forms.ModelForm):

    class Meta:
        model = Model

    def __init__(self, *args, **kwargs):
        super(ModelForm, self).__init__(*args, **kwargs)
        self.fields["models_views"].initial = Models_view.objects.get(id=1)

views.py
def add(request, template_name="lbforum/form_add.html" ):
    if request.method == 'POST':
        f = ModelForm(request.POST)
        if f.is_valid():
            f.save()
            return HttpResponseRedirect(reverse("models"))
    else:
        f = ModelForm()
    ctx = {'form': form}
    return render(request, template_name, ctx)

urls.py
url(r'^add1/$', views.accessories_add, name='accessories_add'),
url(r'^add2/$', views.accessories_add, name='accessories_add1'),

При входе на ссылку url(r'^add1/$', views.add, name='add1'), необходимо в при открытии новой формы forms
self.fields["models_views"].initial = Models_view.objects.get(id=1),
а при url(r'^add2/$', views.add, name='add2')
self.fields["models_views"].initial = Models_view.objects.get(id=2)
  • Вопрос задан
  • 2358 просмотров
Пригласить эксперта
Ответы на вопрос 3
yttrium
@yttrium
Учите python. Как работают классы. Учите базы данных (номальные формы). Учите базовые сущности джанги
Добавьте и передавайте аргумент в функцию инициализации формы. Но у вас и модели както хромают.
и как заметил предыдущий аратор обозначение переменных и обозначения классов в python регламентируются.
Ответ написан
Комментировать
abukin
@abukin
Программирую на Python
В views.py похорошему надобы:
from django.shortcuts import get_object_or_404
...
url_name = request.resolver_match.url_name
if url_name == 'add1':
    pk = 1
elif url_name == 'add2':
    pk = 2

obj = get_object_or_404(PleaseModelNormalName, pk=pk)
f = ModelForm(request.POST, initial={'models_views': obj})


P/S Питон имеет множество возможностей не повторяться. И да, читайте соглашения по джанге и питону. PEP8 вам в помощь.
Ответ написан
@paevlk2007 Автор вопроса
Проблема решена:
models.py
class Models_view(models.Model):
    view_name = models.CharField(max_length=100)

class Model(models.Model):
    name = models.CharField(max_length=100)
    models_views =  models.ForeignKey(Models_view)

forms.py
class ModelForm(forms.ModelForm):
    class Meta:
        model = Model

views.py
def add(request, view=None, template_name="lbforum/form_add.html" ):
    if request.method == 'POST':
        f = ModelForm(request.POST)
        if f.is_valid():
            f.save()
            return HttpResponseRedirect(reverse("models"))
    else:
        if view == 1:
            f = ModelForm(initial={'models_views': Models_view.objects.get(id=1)}) # в этом вся фишка
        else:
            f = ModelForm(initial={'models_views': Models_view.objects.get(id=2)}) # в этом вся фишка
    ctx = {'form': f}
    return render(request, template_name, ctx)

urls.py
url(r'^add1/$', views.add, {'view': 1}, name='add1'), 
url(r'^add2/$', views.add, name='add2'),


Теперь есть две ссылки на одну views, первая форма создается и заполняется (initial) полем models_views с id=1, вторая форма с models_views id=2.

Может есть более оптимальное решение
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы