Django: Как сохранить предопределенные значения в modelForm - PullRequest
1 голос
/ 17 апреля 2020

Добрый вечер,

возможно ли изменить ModelForm внутри моего forms.py, чтобы уже известные значения сохранялись в базе данных? Например:

models.py:

class Customer(models.Model):
    name = models.CharField(max_length=255)

class Project(models.Model):
    customer = models.ForeignKey(Customer, null=False, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)

class Entry(models.Model):
    user = ...request.user.id?...
    customer = models.ForeignKey(Customer, null=False, on_delete=models.CASCADE)
    project= models.ForeignKey(Project, null=False, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)

forms.py:

class EntryForm(ModelForm):
    class Meta:
        model = Entry
        fields = '__all__'

    def __init__(self, *args, pk, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['project'].queryset = Project.objects.filter(customer_id=pk)

При входе на известный сайт я уже знаю о единственно возможном клиенте ( рк)! Я не хочу размещать поле выбора на моем известном сайте, но клиент должен быть сохранен в моей базе данных! То же самое касается активного пользователя (request.user), соответственно, id (request.user.id). Могут ли эти данные быть переданы и в modelForm?

Была ли у кого-то еще эта проблема и может быть найдено решение? Что мне нужно изменить в моей модели, чтобы она заработала?

Спасибо за все ваши усилия и счастливых выходных всем вам!

1 Ответ

1 голос
/ 17 апреля 2020

Вам не нужно. Вы можете просто исключить поле customer из полей:

class EntryForm(ModelForm):
    class Meta:
        model = Entry
        <b>exclude = ['customer']</b>

    def __init__(self, *args, pk, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['project'].queryset = Project.objects.filter(customer_id=pk)

Затем в представлении, где вы используете EntryForm, вы можете реализовать это следующим образом:

def my_view(request, customer_id):
    if request.method == 'POST':
        form = EntryForm(request.POST, request.FILES, pk=customer_id)
        if form.is_valid():
            form<b>.instance.customer_id = customer_id</b>
            form.save()
            return redirect(<i>'name-of-some-view'</i>)
    else:
        form = EntryForm(pk=customer_id)
    return render(request, <i>'name_of_template.html'</i>, {'form': form})

Таким образом, вы можете « ввести » данных, установив их на form.instance.

...