#django #django-models #django-forms #django-views
#django #django-модели #django-forms #django-views
Вопрос:
У меня есть модель с именем profile, в которой есть поле, которое ссылается на другую модель под названием advertisement с использованием ForeignKey. Я пытаюсь разрешить профилю, который вошел в систему, изменять экземпляр рекламы, связанный с их профилем, с веб-страницы с помощью кнопки отправки.
Это модель профиля:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
ethAddress = models.CharField(max_length=42, default='')
advertisement = models.ForeignKey(Advertisement, on_delete=models.CASCADE, null=True, blank=True)
def __str__(self):
return f'{self.user.username} Profile'
Это форма для изменения экземпляра рекламы, связанного с их профилем:
class AdvertisementUpdateForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['advertisement']
Это представление:
def ad_update_view(request, my_id):
obj = Advertisement.objects.get(id=my_id)
profile = get_object_or_404(Profile, user=request.user)
if request.method == 'POST':
ad_form = AdvertisementUpdateForm(request.POST, instance=profile)
if ad_form.is_valid():
ad_form.save()
messages.success(request, f'Your account has been Updated!')
return redirect('profile')
else:
ad_form = AdvertisementUpdateForm(instance=profile)
context = {
'ad_form': ad_form,
'object': obj,
}
return render(request, 'users/advertisement_update.html', context)
Это шаблон, который пользователь будет использовать для изменения рекламы, связанной с его профилем.
{% extends "website/base.html" %}
{% block content %}
<article class="media content-section">
<div class="media-body">
<form method="POST">
<div class="article-metadata">
<a class="mr-2" href="#">{{ object.advertiser }}</a>
<small class="text-muted">{{ object.date_posted|date:"F d, Y" }}</small>
</div>
<h2 class="article-title">{{ object.ad }}</h2>
<p class="article-available">Money Available: ${{ object.available }}</p>
<p class="article-ppc">PPC: ${{ object.ppc }}</p>
<p class="article-thumbnail">{{object.thumbnail}}</p>
{% csrf_token %}
<button class="btn btn-outline-info" type="submit" name="get_URL">Use Ad</button>
</form>
</div>
</article>
{% endblock content %}
Ответ №1:
Я не уверен, что вы делаете в своей форме, но если вы хотите обновить текущий профиль пользователя, вы можете передать его в качестве экземпляра в свою форму следующим образом:
from django.shortcuts import get_object_or_404
def ad_update_view(request, my_id):
profile = get_object_or_404(Profile, user=request.user)
ad_form = AdvertisementUpdateForm(request.POST, instance=profile)
...
В вашей форме вам понадобится только advertisement
поле:
class AdvertisementUpdateForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['advertisement']
Комментарии:
1. Я сделал это, и это имеет смысл, но он по-прежнему не принимает рекламу, которая отображается в представлении, и сохраняет ее в профиле
2. @Benjamin Я не вижу ничего
<input>
подобного в твоей форме