← Назад к вопросам
Как создать форму на странице, что бы изменить поле в БД?
1.6 Junior🔥 281 комментариев
#Django#REST API и HTTP
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Как создать форму на странице, чтобы изменить поле в БД
Рассмотрю полный процесс создания формы в Django для изменения данных в базе.
1. Создание Django формы
# forms.py
from django import forms
from .models import User
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ['name', 'email', 'age']
widgets = {
'name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Enter name'}),
'email': forms.EmailInput(attrs={'class': 'form-control'}),
'age': forms.NumberInput(attrs={'class': 'form-control'}),
}
labels = {
'name': 'Full Name',
'email': 'Email Address',
'age': 'Age',
}
2. Создание модели
# models.py
from django.db import models
class User(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
age = models.IntegerField(null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
3. Создание представления (view)
# views.py
from django.shortcuts import render, redirect, get_object_or_404
from .models import User
from .forms import UserForm
# Обновить существующего пользователя
def update_user(request, user_id):
user = get_object_or_404(User, id=user_id)
if request.method == 'POST':
form = UserForm(request.POST, instance=user)
if form.is_valid():
form.save() # Сохранить в БД
return redirect('user_detail', user_id=user.id)
else:
form = UserForm(instance=user) # Загрузить текущие данные
return render(request, 'update_user.html', {'form': form, 'user': user})
# Создать нового пользователя
def create_user(request):
if request.method == 'POST':
form = UserForm(request.POST)
if form.is_valid():
user = form.save()
return redirect('user_detail', user_id=user.id)
else:
form = UserForm()
return render(request, 'create_user.html', {'form': form})
4. Создание шаблона
<!-- templates/update_user.html -->
{% load static %}
<!DOCTYPE html>
<html>
<head>
<title>Update User</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css">
</head>
<body>
<div class="container mt-5">
<h1>Update User</h1>
{% if form.non_field_errors %}
<div class="alert alert-danger">
{{ form.non_field_errors }}
</div>
{% endif %}
<form method="post" action="{% url 'update_user' user.id %}">
{% csrf_token %}
{% for field in form %}
<div class="mb-3">
{{ field.label_tag }}
{{ field }}
{% if field.errors %}
<div class="alert alert-danger">
{{ field.errors }}
</div>
{% endif %}
</div>
{% endfor %}
<button type="submit" class="btn btn-primary">Save Changes</button>
<a href="{% url 'user_detail' user.id %}" class="btn btn-secondary">Cancel</a>
</form>
</div>
</body>
</html>
5. URL маршруты
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('user/<int:user_id>/update/', views.update_user, name='update_user'),
path('user/create/', views.create_user, name='create_user'),
path('user/<int:user_id>/', views.user_detail, name='user_detail'),
]
6. Валидация формы
# forms.py
from django import forms
from .models import User
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ['name', 'email', 'age']
def clean_email(self):
email = self.cleaned_data.get('email')
# Проверить уникальность
if User.objects.filter(email=email).exclude(id=self.instance.id).exists():
raise forms.ValidationError('Email already exists')
return email
def clean_age(self):
age = self.cleaned_data.get('age')
if age is not None and (age < 0 or age > 150):
raise forms.ValidationError('Age must be between 0 and 150')
return age
def clean(self):
cleaned_data = super().clean()
name = cleaned_data.get('name')
email = cleaned_data.get('email')
if name and email and 'x' in name.lower() and 'x' in email.lower():
raise forms.ValidationError('Invalid combination')
return cleaned_data
7. Обработка файлов в форме
# forms.py
class UserForm(forms.ModelForm):
profile_picture = forms.ImageField(required=False)
class Meta:
model = User
fields = ['name', 'email', 'profile_picture']
# views.py
def update_user(request, user_id):
user = get_object_or_404(User, id=user_id)
if request.method == 'POST':
form = UserForm(request.POST, request.FILES, instance=user)
if form.is_valid():
user = form.save()
if form.cleaned_data.get('profile_picture'):
user.profile_picture = form.cleaned_data['profile_picture']
user.save()
return redirect('user_detail', user_id=user.id)
else:
form = UserForm(instance=user)
return render(request, 'update_user.html', {'form': form})
8. AJAX для обновления без перезагрузки
<!-- templates/update_user.html -->
<form id="user-form">
{% csrf_token %}
<input type="text" id="id_name" name="name" value="{{ user.name }}">
<input type="email" id="id_email" name="email" value="{{ user.email }}">
<button type="submit">Save</button>
</form>
<script>
document.getElementById('user-form').addEventListener('submit', async (e) => {
e.preventDefault();
const formData = new FormData(this);
const response = await fetch(`/user/{{ user.id }}/update/`, {
method: 'POST',
body: formData,
headers: {
'X-CSRFToken': document.querySelector('[name="csrfmiddlewaretoken"]').value
}
});
if (response.ok) {
alert('Updated successfully!');
} else {
alert('Error updating user');
}
});
</script>
9. Динамические формы
# forms.py
class DynamicUserForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Сделать поле необязательным если редактирование
if self.instance.id:
self.fields['email'].required = False
# Отключить поле
self.fields['created_at'].disabled = True
10. Полный пример с функциональностью
# views.py
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
@login_required
def update_user(request, user_id):
user = get_object_or_404(User, id=user_id)
# Проверить права доступа
if request.user.id != user_id and not request.user.is_staff:
return redirect('home')
if request.method == 'POST':
form = UserForm(request.POST, instance=user)
if form.is_valid():
form.save()
if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
return JsonResponse({'status': 'success'})
return redirect('user_detail', user_id=user.id)
else:
if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
return JsonResponse({'status': 'error', 'errors': form.errors}, status=400)
else:
form = UserForm(instance=user)
return render(request, 'update_user.html', {'form': form, 'user': user})
Процесс:
- Пользователь загружает форму со значениями из БД
- Редактирует поля
- Отправляет форму (POST)
- Django валидирует данные
- Если OK — сохраняет в БД
- Иначе показывает ошибки
Это стандартный паттерн в Django!