Reputation: 41
models.py
class Tweet(models.Model):
content = models.TextField(max_length=1000)
...
forms.py
...
tweet = forms.CharField(
widget=forms.Textarea(
label='Tweet',
max_length=Tweet._meta.get_field('tweet').max_length)
...
views.py
class TweetCreate(LoginRequiredMixin, CreateView):
login_url = reverse_lazy('home:login')
model = Tweet
slug_url_kwarg = 'tweet_slug'
form_class = TweetForm
template_name_suffix = '-create'
def form_valid(self, form):
self.tweet = form.save(commit=False)
self.tweet.author = self.request.user
print(form.cleaned_data['tweet']) # Passing case
return super(TweetCreate, self).form_valid(form)
def form_invalid(self, form):
print(form.data['tweet']) # Failing case
return super(TweetCreate, self).form_invalid(form)
Failing case
This is the test text I am using. It has exactly 1000 characters.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porta suscipit tellus eget tristique. Etiam sit amet neque ac sem posuere mollis a imperdiet tellus. Nulla facilisi. Nulla pulvinar in nunc eget pellentesque. Integer volutpat, mauris in sollicitudin dictum, velit turpis rhoncus lacus, ac feugiat libero risus id risus. In ac gravida risus. Sed nec enim vel est interdum scelerisque. Integer at fringilla tortor, sit amet porta tortor. Maecenas congue euismod ipsum. Integer efficitur est risus. Quisque id erat tincidunt, convallis justo eget, eleifend lacus. Praesent volutpat tellus et accumsan accumsan. Curabitur sollicitudin, sem eu finibus iaculis, lectus orci suscipit eros, nec faucibus quam metus quis orc. Aliquam erat volutpat. Cras risus ex, venenatis nec risus eu, scelerisque fermentum neque. Praesent in finibus metus. Aenean mollis nulla nulla, non faucibus orci bibendum ut. Phasellus tincidunt, ipsum vel sollicitudin bibendum, neque augue tincidunt ligula.
eu faucdd++
When I post it, I get Ensure this value has at most 1000 characters (it has 1002).
I printed out the data received in the form_invalid
method of the TweetCreate
view and this is the output. And it's still 1000 chars in length.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porta suscipit tellus eget tristique. Etiam sit amet neque ac sem posuere mollis a imperdiet tellus. Nulla facilisi. Nulla pulvinar in nunc eget pellentesque. Integer volutpat, mauris in sollicitudin dictum, velit turpis rhoncus lacus, ac feugiat libero risus id risus. In ac gravida risus. Sed nec enim vel est interdum scelerisque. Integer at fringilla tortor, sit amet porta tortor. Maecenas congue euismod ipsum. Integer efficitur est risus. Quisque id erat tincidunt, convallis justo eget, eleifend lacus. Praesent volutpat tellus et accumsan accumsan. Curabitur sollicitudin, sem eu finibus iaculis, lectus orci suscipit eros, nec faucibus quam metus quis orc. Aliquam erat volutpat. Cras risus ex, venenatis nec risus eu, scelerisque fermentum neque. Praesent in finibus metus. Aenean mollis nulla nulla, non faucibus orci bibendum ut. Phasellus tincidunt, ipsum vel sollicitudin bibendum, neque augue tincidunt ligula.
eu faucdd++
Passing case
But if I remove the empty line and post the following (Also 1000 chars),
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porta suscipit tellus eget tristique. Etiam sit amet neque ac sem posuere mollis a imperdiet tellus. Nulla facilisi. Nulla pulvinar in nunc eget pellentesque. Integer volutpat, mauris in sollicitudin dictum, velit turpis rhoncus lacus, ac feugiat libero risus id risus. In ac gravida risus. Sed nec enim vel est interdum scelerisque. Integer at fringilla tortor, sit amet porta tortor. Maecenas congue euismod ipsum. Integer efficitur est risus. Quisque id erat tincidunt, convallis justo eget, eleifend lacus. Praesent volutpat tellus et accumsan accumsan. Curabitur sollicitudin, sem eu finibus iaculis, lectus orci suscipit eros, nec faucibus quam metus quis orc. Aliquam erat volutpat. Cras risus ex, venenatis nec risus eu, scelerisque fermentum neque. Praesent in finibus metus. Aenean mollis nulla nulla, non faucibus orci bibendum ut. Phasellus tincidunt, ipsum vel sollicitudin bibendum, neque augue tincidunt ligula. eu faucdd+++
It works. The console output is this,
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porta suscipit tellus eget tristique. Etiam sit amet neque ac sem posuere mollis a imperdiet tellus. Nulla facilisi. Nulla pulvinar in nunc eget pellentesque. Integer volutpat, mauris in sollicitudin dictum, velit turpis rhoncus lacus, ac feugiat libero risus id risus. In ac gravida risus. Sed nec enim vel est interdum scelerisque. Integer at fringilla tortor, sit amet porta tortor. Maecenas congue euismod ipsum. Integer efficitur est risus. Quisque id erat tincidunt, convallis justo eget, eleifend lacus. Praesent volutpat tellus et accumsan accumsan. Curabitur sollicitudin, sem eu finibus iaculis, lectus orci suscipit eros, nec faucibus quam metus quis orc. Aliquam erat volutpat. Cras risus ex, venenatis nec risus eu, scelerisque fermentum neque. Praesent in finibus metus. Aenean mollis nulla nulla, non faucibus orci bibendum ut. Phasellus tincidunt, ipsum vel sollicitudin bibendum, neque augue tincidunt ligula. eu faucdd+++
When I check the length of the failing case strings separately in JS and Python they all show it's 1000. But when it gets submitted, Python finds it as 1002.
What is happening? I am so confused. I am not using anything on the frontend except the default textarea form.
Upvotes: 1
Views: 190
Reputation: 10227
Check out this SO answer: https://stackoverflow.com/a/14217315/6250385
It looks like textarea stores new line characters as '\n' and then when the form is submitted new line characters are converted to '\r\n', thus adding + 1 character to all of the new lines you had there.
Which I find super weird.
So I would suggest one of the following:
\n
with \r\n
like this: textarea.value = textarea.value.replace(/(?<!\r)\n/g, "\r\n")
.Upvotes: 1