Django: получить данные из полей и вставить в 2 таблицы, связанные с пользователем - PullRequest
0 голосов
/ 10 июня 2019

У меня есть базовая HTML-форма с 2 полями (электронная почта и телефон). У меня есть 3 модели:

models.py

class Person(models.Model):
    name = models.CharField()
    surname = models.Charfield()

class Email(models.Model):
    person = models.ForeignKey(Person,editable=False,on_delete=models.CASCADE)
    email = model.EmailField()

class Phone(models.Model):
    person = models.ForeignKey(Person,editable=False,on_delete=models.CASCADE)
    phone = models.CharField()

в моих views.py

/imports/

def home(request):
    context = {'users': Person.object.all()}
    return render(request,'app/home.html',context)

и мой home.html

{% block content %}
{% for user in users %}
Displaying user's attributes

{% for email in user.email_set.all %}
{{ email }}

{% endfor %}
<form method="POST">
<input type="email">
<input type="label">
<button type="submit">Add data</button>
</form>
{% endfor %}
{% endblock content %}

Итак, после нажатия кнопки я хочу получить данные из поля и добавить их в 2 таблицы в моей базе данных, и эти данные должны быть связаны с пользователем, по которому щелкнули. Я знаю, что должен использовать forms.py , но я пытаюсь сделать это без него. Есть ли простой способ решить эту проблему?

1 Ответ

0 голосов
/ 10 июня 2019

Создайте свои формы, используя ModelForm.Затем, если вы хотите добавить, обновить или удалить phone или email, вы можете сделать это из другого представления, используя formset_factory .Я предлагаю нечто подобное.

forms.py

from yourapp.models import Person, Email, Phone
from django.forms impot ModelForm


class EmailForm(ModelForm):
    class Meta:
        model = Person
        fields = '__all__'

views.py

from django.forms import formset_factory


def view_to_update_person_data(request, pk):
    person = get_object_or_404(Person, pk)
    email_formset = model_factory(EmailForm, extra=2)
    for email in person.email_set.all():
        email_formset = email_formset(initial=[{'person': email}]

    if request.method == 'POST':
        # you can proceed one formset by one
        if email_formset.is_valid():
            instances = email_formset.save(commit=false)
            for i in instances:
                i.person = person
                i.save()

    ctx = {'email_formset': email_formset,
           'phone_form': phone_form,
    }
    return TemplateResponse(request, 'your/template/html', ctx)


Посмотрите, какиспользовать formset в работа со страницей форм

...