Уменьшение количества кода в Django видах и формах - PullRequest
1 голос
/ 02 марта 2020

Я недавно прошел курс Net Ninja Django и решил сделать небольшой проект, чтобы в качестве самообучения я пытался создать веб-приложение, которое будет получать показания счетчиков для разных систем (1 - 10).

Не похоже, что имеет смысл создавать функцию для каждой Системы в моем файле Views и снова создавать форму для каждой из них в моем файле Forms, но я не могу думать о какой-либо Другой способ сделать это.

Это функция Views, моя логика c - вы передаете класс модели в функцию view, которая вызывает функцию формы с переданным классом модели.

def fuelLogSystemOne(request, x):
entries = FuelLogSystemOne.objects.all().order_by('date')
if request.method == 'POST':
    form = forms.AddFuelLogOne(request.POST, x)
    if form.is_valid():
        instance = form.save(commit=False)
        instance.staff = request.user
        instance.save()
        return redirect('home')
else:
    form = forms.AddFuelLogOne()
return render(request,'systems/fuellogsystemone.html',{'form':form,'entry':entries})

в моем файле форм:

class AddFuelLogOne(forms.ModelForm,x):
class Meta():
    model = models.x
    fields = ['BucketsAdded']

Моя логика c такова, что вы передадите необходимую модель при вызове fuelsystemLogOne ()

Но когда я выполняю миграции Я получаю сообщение о том, что x не определен.

1 Ответ

2 голосов
/ 02 марта 2020

Вы обычно не делите свою модель на подклассы в форме. Поэтому вы должны удалить x in `class AddFuelLogOne(forms.ModelForm<s>,x</s>):

class AddFuelLogOne(<b>forms.ModelForm</b>):
    class Meta:
        model = models.x
        fields = ['BucketsAdded']

С вашей точки зрения, вы можете передать экземпляр модели через параметр instance=&hellip;. Однако вы не можете извлечь объект модели в качестве параметра, но, скорее всего, id, поэтому вам следует выполнить поиск:

from django.shortcuts import get_object_or_404

def fuelLogSystemOne(request<b>, x_id</b>):
    x = get_object_or_404(X, pk=x_id)
    entries = FuelLogSystemOne.objects.all().order_by('date')
    if request.method == 'POST':
        form = forms.AddFuelLogOne(request.POST<b>, instance=x</b>)
        if form.is_valid():
            for.instance.staff = request.user
            form.save()
            return redirect('home')
    else:
        form = forms.AddFuelLogOne()
    return render(request,'systems/fuellogsystemone.html',{'form':form,'entry':entries})

Дополнительные замечания:

  1. Это может быть хорошая идея добавить суффикс Form к вашему классу AddFuelLogOne, поэтому AddFuelLogOneForm;
  2. Обычно модель записывается в PerlCase , поэтому X, а не x ;
  3. Вы можете опустить () в class Meta;
  4. Имя поля и функция просмотра записаны в snake_case, поэтому fuel_log_system_one и buckets_added.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...