Как я могу сохранить выходные данные, вычисленные в view.py вместе с остальными данными в form.py - PullRequest
0 голосов
/ 17 мая 2019

У меня есть форма с определенными данными с некоторым скрытым полем, т. Е. IP-адресом, так как его не нужно показывать пользователям на странице формы.

После того, как пользователь выберет размер адреса, функция view.py вычислит и выделит блок IP-адресов.

Я хочу, чтобы этот IP-адрес был сохранен вместе с другой информацией в форме.

Пожалуйста, смотрите код ниже

Я подумал передать account = account_form.save(commit=False), затем вызвать account.next_subnet (который отвечает за IP-вызов)

Затем запустить account.save ()

#models.py
class Account(models.Model):
    id = models.AutoField(primary_key=True, editable=False)
    us = models.CharField(max_length=100, blank=False)
    account = models.CharField(max_length=100, blank=False)
    network_size = models.CharField(max_length=100, blank=False)
    network_range = models.CharField(max_length=100, blank=False)
    budget = models.CharField(max_length=100, blank=False)
    account_number = models.IntegerField(blank=True, null=True)
    class Meta:
        db_table = "xxxx"

    def __str__(self):
        return self.account
#forms.py
class AccountForm(ModelForm):

    class Meta:
        model = Account
        fields = (us', 'account', 'network_size', 'budget',)
        CHOICES = (('small', 'small'),('medium', 'medium'),('large','large'),)
        choices=[(x, x) for x in range(500,10000 )]
        widgets = {
            'us': forms.TextInput(attrs={'placeholder': 'us', 'class': 'form-control'}),
            'account': forms.TextInput(attrs={'placeholder': 'account', 'class': 'form-control'}) ,
            'network_size': forms.Select(choices=CHOICES,attrs={'class': 'form-control'}),
            'budget': forms.Select(choices=choices,attrs={'class': 'form-control'}),
            'account_number':forms.HiddenInput(),
            'network_range':forms.HiddenInput(),
}
#views.py
@login_required(login_url='/portal/sign-in/')
def portal_create_account(request, *args, **kwargs):
    account_form = AccountForm(request.POST)
    if request.method == "POST":
        account_form = AccountForm(request.POST)

        if account_form.is_valid():
            account = account_form.save(commit=False)

            account = account_form.cleaned_data['account']
            network_size = account_form.cleaned_data['network_size'];print(network_size)

            nb = pynetbox.api("http://REDACTED","REDACTED")
            get_parent_pref = nb.ipam.prefixes.get(30);print(get_parent_pref)
            prefix = nb.ipam.prefixes.get(prefix=get_parent_pref);print("listpre"+str(prefix))

            if network_size == "small":
                account.next_subnet = prefix.available_prefixes.create({'prefix_length': 28})['prefix']
            elif network_size == "medium":
                account.next_subnet = prefix.available_prefixes.create({'prefix_length': 25})['prefix']
            elif network_size == "large":
                account.next_subnet = prefix.available_prefixes.create({'prefix_length': 24})['prefix']
                account.save()

            return redirect(portal_account)

    return render(request, 'portal/create_account.html', {
        "account_form": account_form
    })

1 Ответ

1 голос
/ 17 мая 2019

Я думаю, что проблема в этих двух строках

account = account_form.save(commit=False)

account = account_form.cleaned_data['account']

Второе определение для account имеет приоритет над первым, что плохо в вашей ситуации.Вы на самом деле хотите назвать второе как-то еще, и тогда вы можете продолжить заполнение account и заканчивая account.save() должно работать.

...