Django блокирует изменение пользователем ввода формы
У меня есть форма экземпляра, которая показывает пользователю данные его профиля, пользователь может обновить некоторые параметры своего профиля, изменив ввод и нажав кнопку обновления.
Но я не хочу, чтобы пользователю было разрешено изменять все данные профиля, например, данные поля подписки Charfields. Как я могу это сделать?
models.py
class Profile(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
telegramusername = models.CharField(max_length=50, default=None)
subscription = models.CharField(max_length=50, default=None)
numberofaccount = models.CharField(max_length=50, default=None)
def __str__(self):
return self.telegramusername
forms.py
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
labels = {
"telegramusername": "Telegram Username",
"subscription": "Subscription Plan",
"numberofaccount": "Number of MT5 Account"
}
fields = ["telegramusername", "subscription", "numberofaccount"]
views.py
def dashboard(request):
profile_data = Profile.objects.get(user=request.user)
profile_form = ProfileForm(request.POST or None, instance=profile_data)
if profile_form.is_valid():
print("worked")
profile_form.save()
context = {
'profile_form': profile_form
}
return render(request, "main/dashboard.html", context)
Вы можете установить атрибут readonly в конструкторе формы
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
[...snip...]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['subscription'].widget.attrs['readonly'] = True
Определите только те поля, которые вы хотите редактировать в Meta.fields следующим образом:
fields = ["telegramusername", "numberofaccount"]
Я заставил его работать, добавив эту строку кода внутри моей формы
subscription = forms.CharField(disabled=True)
forms.py
class ProfileForm(forms.ModelForm):
subscription = forms.CharField(disabled=True)
class Meta:
model = Profile
labels = {
"telegramusername": "Telegram Username",
"subscription": "Subscription Plan",
"numberofaccount": "Number of MT5 Account"
}
fields = ["telegramusername", "subscription", "numberofaccount"]