如何在基于类的视图中用url变量预填充表单



我正试图用我在urls.py中设置的url变量在django中自动填充表单,但我真的不确定如何才能做到这一点,我尝试使用form.instance,但显然它只适用于用户,所以下面是代码,你可以看看我在说什么。

views.py

class AddPostView(CreateView):
model = Post
form_class = PostForm
template_name = 'app1/createpost.html'

def form_valid(self, form, sym):
form.instance.author = self.request.user
form.instance.stock = self.request.sym
return super().form_valid(form)

型号.py

class Post(models.Model):
title = models.CharField(max_length= 255)
header_image = models.ImageField(null = True, blank = True, upload_to = 'images/')
author = models.ForeignKey(User, on_delete=models.CASCADE)
body = RichTextField(blank = True, null = True)
#body = models.TextField()
post_date = models.DateField(auto_now_add=True)
category = models.CharField(max_length=255, default='coding')
snippet = models.CharField(max_length=255)
likes = models.ManyToManyField(User, related_name = 'blog_posts')
stock = models.ForeignKey(StockNames, null=True, on_delete = models.CASCADE)
def total_likes(self):
return self.likes.count()
def __str__(self):
return self.title + ' | ' + str(self.author)

def get_absolute_url(self):
return reverse('app1:article-detail', args=(self.id,))
class StockNames(models.Model):
name = models.CharField(max_length=255)
symbol = models.CharField(max_length=255)
def __str__(self):
return self.symbol

urls.py

urlpatterns = [
path('add_post/<str:sym>',AddPostView.as_view(), name='addpost'),
]

forms.py

class Meta:
model = Post
fields = ('title','category', 'body', 'snippet', 'header_image', 'stock')
widgets = {
'title': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Title', 'length':'100px'}),
#'author': forms.TextInput(attrs={'class': 'form-control', 'value': '', 'id':'elder','type': 'hidden'}),
#'author': forms.Select(attrs={'class': 'form-control'}),
'category': forms.Select(choices = choice_list,attrs={'class': 'form-control', 'placeholder': 'Choices'}),
'body': forms.Textarea(attrs={'class': 'form-control'}),
'snippet': forms.Textarea(attrs={'class': 'form-control'}),
'stock': forms.Select(choices = choice_list,attrs={'class': 'form-control', 'placeholder': 'Choices'})


}

模板

{% extends 'app1/base.html' %}
{% load static %}
{% block body_block %}
{% if user.is_authenticated %}
<h1>Add Blog Post</h1>
<br><br>
<div class="form-group">
<form action="" method="post" enctype = "multipart/form-data">
{% csrf_token %}
{{form.media}}
{{form.as_p}}
<button class= "btn btn-secondary">Post</button>
</form>
</div>
<script>
var name = "{{user.id}}";
document.getElementById("elder").value = name;
</script>
{% else %}
You need to log in
{% endif %}

{% endblock %}

您可以覆盖createview上的def get_initial((,并在那里添加值,以便在视图中预填充表单。

示例

def get_initial(self):
"""
Returns the initial data to use for forms on this view.
"""
initial = super().get_initial()
initial['my_form_field1'] = self.request.something
return initial

将其添加到视图中,并使用正确的值更新表单的字段,然后返回初始值。

要从url中获取get_initial的值,请执行以下操作:

示例

"""
def __init__(self, **kwargs):
Constructor. Called in the URLconf; can contain helpful extra
keyword arguments, and other things.
"""
# Go through keyword arguments, and either save their values to our
# instance, or raise an error.
self.somevalue = kwargs.get('sym')

通过重写definit((,您可以访问与其一起传递的urlconfarguments。因此,当您将sym分配给self.somevalue.时

self.somevalue可用。然后,您可以在get_initial((函数中调用self.somevalue,并将该值传递给正确的表单字段。

最新更新