先日、こちらで質問し、また疑問が生まれたので改めて質問しようと思った次第です。
##聞きたいこと
現在、modelにOneToOneFieldを持たせています。
しかし、CreateViewによって、別objectとしての新規作成ができてしまいます。
その原因と改善方法が知りたいです。
また、私が実装したい機能に対し、そもそもの書き方が間違っているのではないかという不安もあります。ご意見いただければ幸いです。
##実装したいこと
Twitter認証でログインしたユーザが、メモを作成し公開すること。
ただし、メモは一つのみ作成可能。
メモは編集による上書き・削除が可能。
##私がこれまで行なったこと
1.social-auth-app-djangoによるtwitterログイン機能の実装
こちらを参考にし、それ以外に何も記述はしていません。
twitterログイン以外のログイン機能はつけないので、他にUserモデルは必要ないという認識をしています。(ここが間違いなのでしょうか)
2.モデルの作成
ユーザとモデルを一対一の関係になるようにしているつもりです。
import uuid from django.contrib.auth.models import User from django.db import models class Memo(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, null=True) id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) title = models.CharField(max_length=20) content = models.TextField(max_length=5000) image = models.ImageField(upload_to=get_memo_image_path, null=True, blank=True) posted_date = models.DateTimeField(auto_now=True)
3.View作成
#views.py from django.contrib.auth.mixins import LoginRequiredMixin from django.urls import reverse_lazy from django.views.generic import TemplateView, DetailView, CreateView, UpdateView, DeleteView from .forms import MemoForm from .models import Memo class IndexView(TemplateView): template_name = 'index.html' class MemoDetailView(DetailView): model = Memo class MemoCreateView(LoginRequiredMixin, CreateView): model = Memo form_class = MemoForm def get_success_url(self): return reverse_lazy('detail', kwargs={'pk': Memo.id}) login_url = '/login' class MemoUpdateView(LoginRequiredMixin, UpdateView): model = Memo form_class = MemoForm login_url = '/login' def get_success_url(self): url = reverse_lazy("detail", kwargs={"pk": Memo.id}) return url class MemoDeleteView(LoginRequiredMixin, DeleteView): model = Memo success_url = reverse_lazy("index") login_url = '/login'
##余談
質問に関連する余談ですが、model.pyでのuuidをprimaryKeyとしたurlにアクセスできないのです。
これはどういうことなのでしょうか?(別問題でしたら改めて質問します)
#url.py urlpatterns = [ path('', IndexView.as_view(), name="index"), path('<uuid:pk>', MemoDetailView.as_view(), name="detail"), path('<uuid:pk>/update', MemoUpdateView.as_view(), name="update"), path('<uuid:pk>/delete', MemoDeleteView.as_view(), name="delete"), path('create/', MemoCreateView.as_view(), name="create"), path('admin/', admin.site.urls), path('', include('social_django.urls', namespace='social')), ]
上記view.pyのCreateViewにてurlを作成しているイメージです。
そこでhtmlは、
html
1<a class="btn btn-outline-primary" href="{% url 'detail' object.id %}">確認する</a>
と、記述すれど
NoReverseMatch at /create/ Reverse for 'detail' with keyword arguments '{'pk': <django.db.models.query_utils.DeferredAttribute object at 0x10e83d860>}' not found. 1 pattern(s) tried: ['(?P<pk>[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$']
このようなエラーメッセージがでます。
以上になります。
そもそも論でも構いません。ご教授お願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/04/10 09:27
2019/04/10 12:27
退会済みユーザー
2019/04/14 08:55
2019/04/15 10:59