Сохраните дополнительные поля в модели Django, кроме полей, которые присутствовали в форме Django (для той же модели) - PullRequest
0 голосов
/ 31 октября 2019

У меня есть модель Django с несколькими полями, в формах Django, которая создается с использованием этих моделей Django. При использовании метода forms.save я также хочу сохранить дополнительные поля, которые не присутствовали в формах Django, но присутствовали в моделях django.

models.py

class NewProvisionalEmployeeMail(models.Model):
    STATUS_CHOICES = (
    (1, ("Permanent")),
    (2, ("Temporary")),
    (3, ("Contractor")),
    (4, ("Intern"))
    )
    PAY_CHOICES = (
    (1, ("Fixed")),
    (2, ("Performance Based")),
    (3, ("Not Assigned")),
    )
    POSITION_CHOICES = ()
    for i, name in enumerate(Position.objects.values_list('position_name')):
        POSITION_CHOICES += ((i, name[0]),)
    email = models.EmailField(max_length=70, null=False, blank=False, unique=False)
    token = models.TextField(blank=False, null=False)
    offer_sent_by = models.CharField(max_length=50)
    position_name = models.IntegerField(choices=POSITION_CHOICES, null=True, blank=True)
    accepted = models.BooleanField(default=False)
    name=models.CharField(max_length=30)
    user_name=models.CharField(max_length=30)
    pay = models.IntegerField(default=0)
    title = models.CharField(max_length=25, null=True, blank=True)
    pay_type = models.IntegerField(choices=PAY_CHOICES, default=3)
    emp_type = models.IntegerField(choices=STATUS_CHOICES, default=1)

    def __str__(self):
        return str(self.offer_sent_by) +" to " + str(self.email)


    def clean(self):
        if(NewProvisionalEmployeeMail.objects.filter(email=str(self.email)).exists()):
            NewProvisionalEmployeeMail.objects.filter(email=str(self.email)).delete()

    def save(self, **kwargs):
        self.clean()
        return super(NewProvisionalEmployeeMail, self).save(**kwargs)

Если вы видите, оно имеет следующие поля: email, token, offer_sent_by, position_name, accepted, name, user_name, pay, title, pay_type,emp_type. Теперь мне нужны только следующие поля в моих формах: email, position_name, name, user_name, pay, title, pay_type, emp_type, а не token и offer_sent_by значения которых будут определены в моем views.py с использованием некоторой логики.

forms.py

class NewProvisionalEmployeeMailForm(ModelForm):
    class Meta:
        model = NewProvisionalEmployeeMail
        fields = ['email', 'position_name',
        'name', 'user_name', 'pay',
        'title', 'pay_type', 'emp_type',
        ]

Согласно моей логике в views.py другойзначения полей генерируются внутри функции, но, поскольку для сохранения модели мы должны использовать formname.save, здесь это NewProvisionalEmployeeMailForm.save(). Однако это сохранит только те поля, которые приходили из моей формы шаблона, как мне также добавить другие левые поля при сохранении с помощью этой функции.

views.py

def sendoffer(request):
    context = {}
    new_emp_form = NewProvisionalEmployeeMailForm();
    context['form'] = new_emp_form
    hostname = request.get_host() + "/dummyoffer"
    if request.method=='POST':
        new_emp_form = NewProvisionalEmployeeMailForm(request.POST)
        if(new_emp_form.is_valid()):
            token = VALUE COMES FROM LOGIC
            offer_sent_by = VALUE COMES FROM LOGIC
            # I also want to save the fields token, offer_sent_by in my models using this form save method
            new_emp_form.save()

    return render(request, 'mainapp/offer.html',context)

Как видите, new_emp_form метод save будет сохранять только те поля, которые присутствуют в форме, а не поля token и offer_sent_by, которые также являются частью модели. Как сохранить поля с помощью метода form.save?

Ответы [ 2 ]

1 голос
/ 31 октября 2019

впервые мы можем изменить его следующим образом new_emp = new_emp_form.save(commit=False), чтобы я не сохранял в базу данных.

1 голос
/ 31 октября 2019

Сохранение формы возвращает экземпляр NewProvisionalEmployeeMail, поэтому вы можете просто перехватить возвращенный объект в переменной и установить его свойства впоследствии:

if(new_emp_form.is_valid()):
    token = VALUE COMES FROM LOGIC
    offer_sent_by = VALUE COMES FROM LOGIC
    new_emp = new_emp_form.save(commit=False)
    new_emp.token = token
    new_emp.offer_sent_by = offer_sent_by
    new_emp.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...