Как обновить поле внешнего ключа модели профиля с веб-страницы, используя формы django?

#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> подобного в твоей форме