Django - сохранить форму в базе данных - PullRequest
0 голосов
/ 10 сентября 2018

Эй, парень, мне нужна ваша помощь

, поэтому у меня есть эта модель:

class PreferedShops(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    shop = models.ForeignKey(Shops, on_delete=models.CASCADE)
    date_posted = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.user.username, self.shop.name

, и это форма:

class LikeShopForm(forms.ModelForm):
    class Meta:
        model = PreferedShops
        fields = ['date_posted']

, и это вид:

def shops(request):
    if request.method == 'POST':
        form = LikeShopForm(request.POST)
        if form.is_valid():
            u = form.save(commit=False)
            u.user = request.user
            u.shop = request.shop
            u.save()
            return redirect('shops')
    else:
        form = LikeShopForm()
    return render(request, "shops.html", {'form': form})

проблема, которая у меня возникает, когда я нажимаю кнопку «Мне нравится», я хочу, чтобы форма автоматически брала имя пользователя и название магазина, а затем сохраняла их в базе данных пользователя иПри нажатии кнопки «Отправить» имя магазина должно быть скрыто. У меня есть эта ошибка У объекта «WSGIRequest» нет атрибута «Магазин»

. Пожалуйста, помогите мне автоматически взять имя магазина и сохранить его в БД.

1 Ответ

0 голосов
/ 10 сентября 2018

Ну, магазин - это , а не часть запроса (строго говоря, user тоже нет, но он часто добавляется к объекту request в промежуточном программном обеспечении, просматривая сеанс).

Таким образом, вам необходимо закодировать в URL или в параметрах POST. Например с:

# app/urls.py

from django.urls import path
from app.views import like_shop

urlpatterns = [
    path('shop/<b><int:shop_id></b>/like', like_shop, name='like_shop'),
]

Затем в представлении мы получаем параметр shop_id, который содержит id связанного Shops объекта:

from django.shortcuts import get_object_or_404
from app.models import Shops

def like_shop(request<b>, shop_id</b>):
    if request.method == 'POST':
        shop = <b>get_object_or_404(Shops, id=shop_id)</b>
        form = LikeShopForm(request.POST)
        if form.is_valid():
            u = form.save(commit=False)
            u.user = request.user
            u.shop = <b>shop</b>
            u.save()
            return redirect('shops')
    else:
        form = LikeShopForm()
    return render(request, "shops.html", {'form': form, 'shop_id': shop_id})

Тогда запрос в POST должен указывать на:

<!--  shops.html -->

<form action="<b>{% url 'like_shop' shop_id=shop_id %}</b>" method="post">
  <!--  ... -->
</form>

URL-адрес этой страницы, таким образом, выглядит как /shops/123/like с 123 id магазина. Таким образом, если вы хотите пропустить магазин "неявно", вам нужно закодировать его в URL. В противном случае вы должны сделать это поле формы, чтобы пользователь мог выбрать опцию. Лично мне очень странно, что вы используете date_posted в качестве поля формы, поскольку обычно это поле, которое я ожидаю заполнить отметкой времени, когда пользователю нравится магазин.

Примечание : название модели обычно единственное число , поэтому Shop вместо Shops.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...